【问题标题】:Does having lots of threads WaitingForSingleObject() will worsen performance?有很多线程 WaitingForSingleObject() 会降低性能吗?
【发布时间】:2013-05-25 07:15:09
【问题描述】:

我有一个使用 WIN32 API 的 C 代码。

在我的程序中,主线程创建了很多事件(Using CreateEvent),然后为每个WaitForSingleObject的Event创建一个线程(Using CreateThread)。

创建大量WaitForSingleObject的线程会恶化主线程的性能吗?

【问题讨论】:

  • “很多线程”是什么意思?数十、数百、数千?
  • 阻塞的线程没有被调度,因此它们对另一个线程的影响为零。无论如何,每个事件一个线程是个坏主意。
  • 问题是我需要知道什么事件信号。我认为这将是比 waitingForMultiple 和手动检查更好的解决方案

标签: c multithreading performance winapi synchronization


【解决方案1】:

当线程等待 WaitForSingleObject 调用时,性能成本非常低。在发出它等待的对象发出信号之前,该线程根本不会被调度。设计一个程序有几个线程等待,做一些工作,然后再次等待是很正常的。

需要注意的成本是:

  • 不断创建新线程而不是重复使用线程。
  • 具有高争用的锁。尽可能让单独的线程处理它们自己的数据副本,这样它们就不需要额外的同步。 (查找锁定车队。)
  • I/O 争用。如果您的限制因素是您可以将数据移入和移出内存(例如,从磁盘或网络)的速度,那么使用更少的线程可能会更好。
  • 有多个线程同时工作。您可以让许多线程等待,但如果在给定时刻实际运行的线程数远大于内核数,那么您将开始失去线程化的好处。
  • 将作品分成小片。如果您的线程醒来只做少量的工作,那么启动和关闭的开销可能会变得很大。 (这类似于一个循环,其中测试循环条件的开销与循环体中完成的工作量处于同一顺序。)“微小”是主观的,可能与机器有关。您必须进行概要分析才能调整工作量(假设它是可调整的)。

【讨论】:

    【解决方案2】:

    其他答案给出了很好的答案。但是,如果需要考虑创建大量线程,则可能使用WaitForMultipleObjects 可能是一种替代方法。

    您问题的“真实”答案实际上取决于“批次”是什么,以及每个线程在“触发”时应该做什么。如果不理解这一点,几乎不可能说出最佳解决方案是什么。因此,我建议另一种选择。

    只要性能是问题的一部分,衡量、改变、衡量、改变、衡量就是要走的路。不要只是遵循互联网上的一些建议,认为“这个页面说这是正确的解决方案,所以我正在这样做”。魔鬼往往在细节中,所以有人发现在他们的情况下是正确的,在你的情况下可能不正确,因为线程内部的确切工作负载是不同的,例如。更复杂的是,计算机体系结构不断变化,所以今天的“正确”解决方案不一定是五年后的正确解决方案,或者五年前不是正确的解决方案。

    【讨论】:

      猜你喜欢
      • 2021-11-19
      • 2015-10-29
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 2020-08-24
      • 1970-01-01
      • 2011-04-26
      相关资源
      最近更新 更多