繁体   English   中英

同步工作线程

[英]Synchronizing worker threads

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

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

简而言之,这些是步骤。

  1. 将发送命令x线程化到所有工作线程。
  2. 线程一直等到所有工人都完成了。
  3. 线程a做处理。
  4. 回到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
 }

使用信号量也可以实现相同的功能。 信号量和屏障都可以使用互斥锁和条件变量来实现。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM