2013-03-17 51 views
3

我有一个场景,我正试图想出最佳的同步方法。我们假定C++ 11中的std :: thread存在,所以不需要担心各种线程库之间的差异等。正在同步工作者线程

场景是这样的。线程a,主线程想要将任务分发给一堆工作线程。然后,在暂时发布最终说明之后,需要等待所有线程完成其工作。我们不想加入他们,只是等待他们完成他们的任务。然后,线程必须分析来自所有线程的收集数据,然后向工作人员发出命令以再次开始该程序。

总之,这些是步骤。

  1. 线程发送命令x到所有工作线程。
  2. 线程a等待所有工作人员完成。
  3. 线程a处理。
  4. 回到1

,你有什么建议,我用?简单的互斥体?条件变量?两者的结合?将不胜感激关于如何构建同步的尽可能高效的任何提示。

回答

1

您有n个工作线程和一个主线程a,它将任务委托给工作人员,并且必须等待他们完成这些任务,然后才能为他们分配新的一批任务。

的基本技术是使用一个屏障(如boost::barrier)至工作线程和a的结束同步。

该障碍的初始化为n+1。主线程a在屏障上等待,每个工作线程在其任务结束时执行相同的操作。当最后一个线程在屏障上调用wait时,所有线程都被唤醒,主线程可以继续工作。您可能需要添加第二个屏障来阻止工作线程,直到将新任务分配给它们。

工作线程的主体可能看起来像下面的伪代码:

while (running) { 
    startbarrier.wait(); // wait for main thread to signal start 
    do_work(); 
    endbarrier.wait(); // signal end of work 
} 

同样的事情也可以用信号量实现。信号量和屏障可以用互斥量和条件变量来实现。

请参阅this SO question了解更多详情。

+0

障碍原来是我所需要的。谢谢! – 2013-03-18 10:47:14

+0

很高兴能有所帮助。 – didierc 2013-03-18 11:10:18

+0

@didierc我猜''n'是线程的数量。但总是最好定义你的变量。 – user877329 2014-06-12 09:05:32