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

Gal*_*e33 1 c performance winapi multithreading synchronization

我使用WIN32 API在C中有一个代码.

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

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

Adr*_*thy 6

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

需要注意的成本是:

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