【问题标题】:Are there drawbacks of creating a lot of short-life threads?创建大量短寿命线程是否有缺点?
【发布时间】:2017-08-04 13:15:10
【问题描述】:

如果我们创建一个寿命短的线程(200 毫秒到 1 秒)来在文本框字段中的每次按键上执行搜索任务,是否有缺点? p>

std::wstring query;

void DoTheSearch ()
{
     // 200ms to 1sec long processing that would block the GUI if no dedicated thread 
     // search a database using query variable
}


// main window message loop
case WM_COMMAND:
// ...
    if (wmEvent == EN_CHANGE)
    {
        query = GetTheQueryStringFromTextBox(...);
        DWORD threadID;
        HANDLE hThread = CreateThread(NULL, 0, DoTheSearch, NULL, 0, &threadID); 
        // there will be a lot (for each keypress) of short-life threads often
    }

或者我应该只为搜索创建一个线程while (True) 大部分时间处于空闲状态,而Sleep(10); 在内部?)。


注意:我还实现了一个“去抖动”功能,以避免每次按键都进行多次搜索,但这不在此处讨论。

【问题讨论】:

  • 你要做的是查找conditions这将让你有一个没有“睡眠”的单线程
  • 我不认为这个问题不好,但它实际上包含两个。
  • @HannesHauptmann 它也在不断变化
  • 在整个作品中(无论用户键入多快)可能会引发扳手的是所创建线程的非确定性执行顺序。在按键时间 t+1 之前查找按键时间 t+5 可能(或可能不)可以。如果有来自消息队列的 UI 反馈取决于按键,用户可能会觉得有点令人不安。当然取决于用例
  • 不过,我的观点仍然是,创建线程的成本相对较高,而且工作时间短且工作量不大的线程并不划算。

标签: c++ windows multithreading winapi


【解决方案1】:

与流行的观点相反,创建线程并不昂贵。虽然我没有要测试的 Windows 机器,但我认为现代 Windows 系统上的线程创建时间在单个微秒单位内(就像在 Linux 上一样)。

因此,如果您的设计在使用短命线程场景时变得更加简单,并且线程没有要持久的上下文,并且在任何给定时间您只有一个工作线程,并且它们启动不那么频繁(例如,每个10 秒或更长时间)我认为没有特别的理由来弯曲设计以允许线程消息排队。

【讨论】:

  • 鉴于问题表明每次按键都会完成,因此断言“一个工作线程”和“不经常启动”是错误的。
  • @UKMonkey,你打字的速度有多快? :D
  • 用我的手还是脚? :P
  • @UKMonkey 您能建议(在回答中)更清洁的方式吗?我可以启动一个线程,但是我应该如何等待带有while (true) 的新 DoTheSearch 消息?也许只是
  • “那么贵”有多贵?如果您承认创建和销毁线程的成本相对于增加计数器的成本。
猜你喜欢
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2011-03-16
  • 2015-04-19
  • 2021-07-14
  • 1970-01-01
相关资源
最近更新 更多