現在、私は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()の違いは何ですか?
26
A
答えて
22
条件変数にブロックされたスレッドが10個ある場合、たとえばnotify_one()
は1つのスレッドのみをブロック解除し、notify_all()
はそれらをすべてブロック解除します。あなたの場合は、notify_one()
を使用して、待機していないスレッドを起動させないようにします。
関連する問題
- 1. std :: setとstd :: vectorの違いは何ですか?
- 2. std :: valarrayとstd :: arrayの違いは何ですか
- 3. std :: string :: c_strとstd :: string :: dataの違いは何ですか?
- 4. std :: tieとstd :: make_tupleのstd :: ref引数の違いは何ですか?
- 5. C++ 11:なぜstd :: condition_variableはstd :: unique_lockを使用しますか?
- 6. "UTF-16"と "std :: wstring"の違いは何ですか?
- 7. std :: mutexとstd :: condition_variable構築オーバーヘッドとヒープ割り当て
- 8. std :: logical_notとstd :: not1の違いは?
- 9. boost :: condition_variable :: timed_wait()は偽のウェイクアップで何を返しますか?
- 10. このSTDと何が間違っている:: STDをコンパイルするとき
- 11. Callable概念とstd :: is_function型形質の違いは何ですか?
- 12. std:stringとstd :: stringの違い
- 13. difftimeと ' - 'の違いは何ですか?
- 14. A`と ``の違いは何ですか[:] `
- 15. `&`と `ref`の違いは何ですか?
- 16. バックスティックと$()の違いは何ですか?
- 17. `##`と `hashCode`の違いは何ですか?
- 18. "$^N"と "$ +"の違いは何ですか?
- 19. #{} $ {}と%{}の違いは何ですか?
- 20. typedefとの違いは何ですか?
- 21. %Qと%{}の違いは何ですか?
- 22. `==`と `is`の違いは何ですか?
- 23. $と$$の違いは何ですか?
- 24. NodeJS:「./ ..」と「..」の違いは何ですか?
- 25. 型キャストとstd :: move()の違いは?
- 26. ATL CAutoPtrとSTL std :: auto_ptrの違いは?
- 27. ブーストスマートポインタとスタンダードスマートポインタの違いは何ですか?
- 28. string :: atとstring :: operator []の違いは何ですか?
- 29. sizeofとalignofの違いは何ですか?
- 30. リストと何か([_])と何か(_)の違い
ありがとう、GMan。私はインターネットからいくつかの文書を読みました。あなたが言ったように。しかし、典型的には、wait()関数はmutex上で使用されます。 std :: unique_lock ul(m_mutexTask); while(m_lTask.empty()){m_condTask.wait(ul); }。その後、notify_all()はすべてのスレッドを起動させますが、スレッドが1つだけmutexをロックする可能性があります。 –
一度に1つのスレッドだけがmutexをロックしますが、それらはmutexを取得するとすぐにすべて 'wait'から復帰します。 –
@Yun:使用するのは、待機中のスレッドが待っているものを処理できるかどうかによって異なります。いずれかがあれば(たとえば、キュー上の複数の同一のリーダー)、notify_oneを使用すると効率的です。待ち状態のスレッドが実際にループ状態で成功するような複雑な条件がある場合は、notify_oneによってどのスレッドが呼び起こされるかを制御できないため、すべてを起動する必要があります。 –