c++多线程同步

Posted

技术标签:

【中文标题】c++多线程同步【英文标题】:c++ multithreading synchronization 【发布时间】:2011-12-28 15:40:53 【问题描述】:

这是我的问题的简化版本。

有N个线程在一个无限循环中执行以下3条指令:

A -> B -> C -> A -> B -> C -> A -> B -> .......

我希望所有线程同时执行指令 B,即任何线程执行 B 应该只有在所有线程都到达 B 时才开始。所以,如果有一个线程执行了 B -> C -> A,它应该等待直到其他线程也准备好执行B为止。

如果可能,请告诉我一个适用于 Windows 和 MAC 的便携式解决方案。

【问题讨论】:

就在昨天Bartosz Milewski posted his vidcast on C++11 Concurrency Series: 9. Condition Variables。我发现它是该系列中最有趣的(我认为无需先查看其他内容) 【参考方案1】:

您应该查看Boost thread library,尤其是关于condition variables 的部分。

【讨论】:

虽然这听起来更像你想要一个barrier @MikeSeymour:你为什么不添加它作为答案? 谢谢迈克,是的,我需要的是屏障。让我深入了解它的细节并在我遇到问题时回来。再次感谢!【参考方案2】:

N-1 信号量和互斥量的数组?所有线程都获取互斥锁,包括一个计数器,如果小于 N,则释放互斥锁并在 [counter] 处等待信号量数组。第 N 个线程发现计数器为 N,向所有信号量发出信号,将计数器重置为 0,执行“B”释放互斥体并退出。其他线程在释放时也执行 B,但不能循环并再次进入,直到第 N 个线程执行“B”并释放互斥体。

所有多任务操作系统都有信号量/互斥量。如果可用,您可以使用事件来代替信号量。

【讨论】:

实际上,一个信号量发出 [n-1] 次信号就可以了 - 与事件不同,信号量不需要数组。

以上是关于c++多线程同步的主要内容,如果未能解决你的问题,请参考以下文章

为啥在多线程应用程序 C++ 中没有发生同步

C++多线程同步技巧--- 互斥体

C++多线程同步技巧--- 事件

C++多线程同步的几种方式

C++多线程同步的几种方式

简单的多线程帮助? C++、WaitForSingleObject 和同步