std::condition_variable_any:: notify_all
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Notification | ||||
|
condition_variable_any::notify_all
|
||||
| Waiting | ||||
|
void
notify_all
(
)
noexcept
;
|
(C++11以降) | |
現在 * this を待機している全てのスレッドのブロックを解除します。
注記
notify_one()
/
notify_all()
の効果と、
wait()
/
wait_for()
/
wait_until()
の3つのアトミックな部分
(ロック解除+待機、ウェイクアップ、ロック)は、
変更順序
として見なせる単一の全順序で発生します:この順序は個々の条件変数に固有です。これにより、例えば
notify_one()
が遅延して、
notify_one()
の呼び出し直後に待機を開始したスレッドのブロックを解除する、といったことが不可能になります。
通知スレッドは、待機スレッドが保持しているものと同じミューテックスのロックを保持する必要はありません。そうすると却って非効率になる可能性があります。なぜなら、通知されたスレッドは、通知スレッドがロックを解放するのを待って、直ちに再びブロックすることになるからです。ただし、一部の実装ではこのパターンを認識し、ロック下で通知されたスレッドの起床を試みないようになっています。
例
#include <chrono> #include <condition_variable> #include <iostream> #include <thread> std::condition_variable_any cv; std::mutex cv_m; // このミューテックスは3つの目的で使用されます: // 1) iへのアクセスを同期するため // 2) std::cerrへのアクセスを同期するため // 3) 条件変数cvのため int i = 0; void waits() { std::unique_lock<std::mutex> lk(cv_m); std::cerr << "Waiting... \n"; cv.wait(lk, []{ return i == 1; }); std::cerr << "...finished waiting. i == 1\n"; } void signals() { std::this_thread::sleep_for(std::chrono::seconds(1)); { std::lock_guard<std::mutex> lk(cv_m); std::cerr << "Notifying...\n"; } cv.notify_all(); std::this_thread::sleep_for(std::chrono::seconds(1)); { std::lock_guard<std::mutex> lk(cv_m); i = 1; std::cerr << "Notifying again...\n"; } cv.notify_all(); } int main() { std::thread t1(waits), t2(waits), t3(waits), t4(signals); t1.join(); t2.join(); t3.join(); t4.join(); }
出力例:
Waiting... Waiting... Waiting... Notifying... Notifying again... ...finished waiting. i == 1 ...finished waiting. i == 1 ...finished waiting. i == 1
関連項目
|
待機中の1つのスレッドを通知
(公開メンバ関数) |
|
|
Cドキュメント
for
cnd_broadcast
|
|