1

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

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

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

4

2 回答 2

6

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

需要注意的成本是:

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

其他答案给出了很好的答案。但是,如果创建大量线程是一个问题,也许使用WaitForMultipleObjects可能是一种替代方法。

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

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

于 2013-05-29T22:22:08.323 回答