C++多线程同步

7
这里是我问题的简化版本。
有N个线程在无限循环中执行以下3条指令:
A -> B -> C -> A -> B -> C -> A -> B -> .......

我希望所有线程都能同时执行指令B,即只有当所有线程都到达B时,任何一个线程才开始执行B。因此,如果有一个线程已经执行了B -> C -> A,它应该在此等待,直到其他线程也准备好执行B。
如果可能的话,请告诉我一个可移植的解决方案,可以在Windows和MAC上工作。

仅昨天,**Bartosz Milewski发布了他的C++11并发系列视频:9.条件变量**。我认为这是该系列中最有趣的一个(无需先观看其他视频)。 - sehe
2个回答

4

7
虽然这听起来更像是你想要一个屏障 - Mike Seymour
@MikeSeymour:为什么不把它添加为答案? - jgauffin
谢谢Mike,是的,看起来barrier正是我需要的。如果我遇到问题,让我深入了解它的细节并回来。再次感谢! - arvin

0

一个由N-1个信号量和一个互斥锁组成的数组?所有线程都会获取互斥锁,增加计数器,如果小于N,则释放互斥锁并在[计数器]处等待信号量数组。第N个线程发现计数器为N时,会向所有信号量发送信号,将计数器重置为0,执行'B',释放互斥锁并退出。其他线程在被释放后也会执行B,但在第N个线程执行'B'并释放互斥锁之前,它们无法循环并再次进入。

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接