我有一个方案,我试图提出最好的同步方法。我们假设存在C ++ 11中的std :: thread,因此无需担心各种线程库之间的差异等。
情景就是这样。线程a,主线程,想要将任务分发给一堆工作线程。然后,在暂时发出最终指令后,需要等待所有线程完成其工作。我们不想加入他们,只是等待他们完成他们的任务。然后线程a必须分析来自所有线程的收集数据,然后向工作人员发送命令以再次开始该过程。
简而言之,这些是步骤。
您建议我使用什么?简单的互斥?条件变量?两者的结合?有关如何使同步结构尽可能高效的任何提示将不胜感激。
答案 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。