2011-11-14 102 views
7

这里是我的问题的一个简化版本。C++多线程同步

有执行以下无限循环3说明N个线程:

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

我想所有的线程执行指令B同时即如果所有线程都达到B.任何线程B的执行应该只是开始因此,如果有已执行B中的话题 - >ç - > A,它应该在这里等着,直到其他线程也准备执行B.

如果可能的话,请让我知道的便携式解决方案,将工作在两个窗口& MAC。

+0

只有昨天** [Bartosz Milewski在C++ 11 Concurrency Series上发布了他的视频:9.条件变量](http://bartoszmilewski.wordpress.com/2011/11/13/c11-concurrency-series-9 -condition变量/)**。我发现它是系列中最具娱乐性的(不需要首先查看其他人,我认为) – sehe

回答

4

你应该检查出Boost thread library,尤其是关于condition variables部分。

+7

虽然这听起来更像是你想要[屏障](http://www.boost.org/doc/libs/1_47_0/ doc/html/thread/synchronization.html#thread.synchronization.barriers) –

+0

@MikeSeymour:你为什么不把它添加为答案? – jgauffin

+0

感谢迈克,是的,看起来屏障是我需要的。让我了解一下它的细节,并回过头来解决我遇到的问题。再次感谢! – arvin

0

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

所有多任务操作系统有信号灯/互斥。你可以使用一个事件,如果可用的话,而不是信号量。

+1

事实上,一个信号量[n-1]次将会很好 - 不像事件那样,没有信号量的数组。 –