同步工作线程

时间:2013-03-17 21:41:21

标签: c++ multithreading c++11 synchronization

我有一个方案,我试图提出最好的同步方法。我们假设存在C ++ 11中的std :: thread,因此无需担心各种线程库之间的差异等。

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

简而言之,这些是步骤。

  1. 将命令x发送到所有工作线程。
  2. 线程等待所有工作人员完成。
  3. 线程a处理。
  4. 回到1。
  5. 您建议我使用什么?简单的互斥?条件变量?两者的结合?有关如何使同步结构尽可能高效的任何提示将不胜感激。

1 个答案:

答案 0 :(得分: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