2011-11-14 97 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]次將會很好 - 不像事件那樣,沒有信號量的數組。 –