4

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

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

简而言之,就是这些步骤。

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

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

4

1 回答 1

2

您有 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
 }

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

有关更多详细信息,请参阅此 SO 问题

于 2013-03-17T22:52:15.577 回答