2011-11-14 14 views
7

ここに私の問題の単純化バージョンです。私は、すべてのスレッドが任意のスレッドによってBの命令B同時にすなわち実行を実行することを望んC++マルチスレッド同期

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

すべてのスレッドがBに到達した場合にのみ起動する必要があります。

そこは無限ループで3つの指示に従って実行し、N個のスレッドがありますしたがって、B - > C - > Aを実行したスレッドがある場合は、他のスレッドも実行準備が整うまで待ちます。

可能であれば、動作するポータブルなソリューションを教えてください両方のウィンドウで& MAC。

+0

昨日** [Bartosz Milewskiは彼のvidcastをC++ 11 Concurrency Series:9.条件変数に投稿しました(http://bartoszmilewski.wordpress.com/2011/11/13/c11-concurrency-series-9 -condition-variables /)**。私はそれがシリーズの中で最も面白いと思った(他人を最初に見る必要はない、と思う) – 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セマフォとmutexの配列?すべてのスレッドは、ミューテックスを取得し、カウンタをインクリメントし、Nより小さければ、ミューテックスを解放し、[カウンタ]でセマフォ配列を待つ。 N番目のスレッドはカウンタをNにし、すべてのセマフォを通知し、カウンタを0にリセットし、 'B'を実行してmutexを解放して終了します。他のスレッドは解放されたときにもBを実行しますが、N番目のスレッドが 'B'を実行してミューテックスを解放するまでループして再び入りません。

すべてのマルチタスクOSにはセマフォ/ミューテックスがあります。可能であれば、セマフォの代わりにイベントを使用することができます。

+1

実際には、[n-1]回送信された1つのセマフォはうまくいくでしょう - イベントとは異なり、セマフォに必要な配列はありません。 –

関連する問題