【问题标题】:Synchronizing worker threads同步工作线程
【发布时间】:2013-03-17 21:41:20
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案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

    【讨论】:

    • 障碍正是我所需要的。谢谢!
    • @didierc 我猜n 是线程数。但总是最好定义你的变量。
    猜你喜欢
    • 1970-01-01
    • 2012-02-19
    • 2021-01-31
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    相关资源
    最近更新 更多