我有一个场景,我正试图想出最好的同步方法。我们假设C++11中存在std::线程,所以不需要担心不同线程库之间的差异等等。
情况是这样的。线程a,主线程,希望将任务分发给一组工作线程。然后,在给出它的最后指示之后,它需要等待所有的线程完成他们的工作。我们不想加入他们,只是等待他们完成他们的任务。然后,线程a必须分析从所有线程收集到的数据,然后向工作人员发出命令,以便再次开始该过程。
简而言之,这就是步骤。
你建议我用什么?简单的互斥?条件变量?两者的结合?任何关于如何构造同步尽可能高效的提示将不胜感激。
发布于 2013-03-17 22:52:15
您有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。
https://stackoverflow.com/questions/15466560
复制相似问题