gpt4 book ai didi

c++ - 同步工作线程

转载 作者:太空狗 更新时间:2023-10-29 23:06:29 25 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

你有 n 个工作线程和一个主线程 a,它把任务委托(delegate)给工作线程,并且必须等待他们完成这些任务,然后再给他们分配新的一批任务。

基本技术是使用屏障(如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了解更多详情。

关于c++ - 同步工作线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15466560/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com