2012-01-26 35 views
26

現在、私はstd::threadをC++ 11で使用してマルチスレッドプロジェクトを実装しています。私はstd::condition_variableを使ってスレッドを同期させます。具体的には、あるコンシューマ関数がwait()メンバ関数std::condition_variableを呼び出してグローバルタスクキューからタスクを待機し、別のプロデューサ関数がタスクを生成してキューに入れます。しかし、notify_all()notify_one()のメンバー機能の違いがstd::condition_variableであることはわかりません。プロデューサ関数ではどの関数を使用する必要がありますか?ありがとう!std :: condition_variableのnotify_all()とnotify_one()の違いは何ですか?

答えて

22

条件変数にブロックされたスレッドが10個ある場合、たとえばnotify_one()は1つのスレッドのみをブロック解除し、notify_all()はそれらをすべてブロック解除します。あなたの場合は、notify_one()を使用して、待機していないスレッドを起動させないようにします。

+1

ありがとう、GMan。私はインターネットからいくつかの文書を読みました。あなたが言ったように。しかし、典型的には、wait()関数はmutex上で使用されます。 std :: unique_lock ul(m_mutexTask); while(m_lTask​​.empty()){m_condTask.wait(ul); }。その後、notify_all()はすべてのスレッドを起動させますが、スレッドが1つだけmutexをロックする可能性があります。 –

+6

一度に1つのスレッドだけがmutexをロックしますが、それらはmutexを取得するとすぐにすべて 'wait'から復帰します。 –

+13

@Yun:使用するのは、待機中のスレッドが待っているものを処理できるかどうかによって異なります。いずれかがあれば(たとえば、キュ​​ー上の複数の同一のリーダー)、notify_oneを使用すると効率的です。待ち状態のスレッドが実際にループ状態で成功するような複雑な条件がある場合は、notify_oneによってどのスレッドが呼び起こされるかを制御できないため、すべてを起動する必要があります。 –

関連する問題