在线文档教程
C++
线程支持 | Thread support

std::condition_variable_any::notify_all

性病:情况[医]变量[医]任何:通知[医]全

void notify_all((since C++11)

取消阻塞当前等待的所有线程。*this...

参数

%280%29

返回值

%280%29

例外

noexcept规格:

noexcept

注记

对…的影响notify_one()/notify_all()三个原子部分wait()/wait_for()/wait_until()%28解锁+等待、唤醒和锁定%29按一个总顺序进行,可视为修改顺序原子变量的顺序是特定于这个单独的条件的。[医]变量。这使得不可能notify_one(),例如,延迟并取消阻塞在调用之后才开始等待的线程。notify_one()被制造出来了。

通知线程不需要在等待线程%28s%29所持有的互斥锁上持有锁;实际上,这样做是一种悲观,因为被通知的线程将立即再次阻塞,等待通知线程释放锁。

二次

#include <iostream> #include <condition_variable> #include <thread> #include <chrono> std::condition_variable_any cv; std::mutex cv_m; // This mutex is used for three purposes: // 1) to synchronize accesses to i // 2) to synchronize accesses to std::cerr // 3) for the condition variable 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

二次

另见

notify_onenotifies one waiting thread (public member function)

c CND文件[医]广播

© cppreference.com

在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。

http://en.cppreference.com/w/cpp/线程/条件[医]变量[医]任何/通知[医]全