有很多线程WaitingForSingleObject()会恶化性能吗?

时间:2013-05-29 21:11:23

标签: c multithreading performance winapi synchronization

我使用WIN32 API在C中有代码。

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

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

2 个答案:

答案 0 :(得分:6)

线程在WaitForSingleObject调用中等待时,性能成本非常低。线程将不会被调度,直到它正在等待的对象发出信号。设计一个具有多个线程的程序是很正常的,这些线程等待,做一些工作,然后再等一下。

需要注意的成本是:

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

答案 1 :(得分:3)

其他答案给出了很好的答案。但是,如果需要创建大量线程,可能使用WaitForMultipleObjects可能是另一种选择。

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

每当绩效成为问题的一部分时,衡量,改变,衡量,改变,衡量就是最佳选择。不要只是按照互联网上的一些建议来思考“这个页面说这是正确的解决方案,所以我正在这样做”。魔鬼通常都在细节中,所以在他们的情况下,人们发现的是正确的,因为例如,线程内的确切工作量是不同的。为了使其更复杂,计算机体系结构不断变化,那么今天的“正确”解决方案在五年内不一定是正确的解决方案,或者五年前不是正确的解决方案。