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

std::condition_variable::notify_one

性病:情况[医]变量::通知[医]1

void notify_one((since C++11)

如果有线程在等待*this,呼叫notify_one打开一个等待线程。

参数

%280%29

返回值

%280%29

例外

noexcept规格:

noexcept

注记

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

通知线程不需要在等待线程%28s%29所持有的互斥锁上持有锁;实际上,这样做是一种悲观,因为被通知的线程将立即再次阻塞,等待通知线程释放锁。但是,一些实现%28--特别是pThings%29的许多实现--认识到了这种情况,并避免了这种“匆忙等待”的情况,方法是将等待线程从条件变量%27s队列直接转移到通知调用中的互斥队列,而不唤醒它。

二次

#include <iostream> #include <condition_variable> #include <thread> #include <chrono> std::condition_variable cv; std::mutex cv_m; int i = 0; bool done = false; void waits() { std::unique_lock<std::mutex> lk(cv_m std::cout << "Waiting... \n"; cv.wait(lk, []{return i == 1;} std::cout << "...finished waiting. i == 1\n"; done = true; } void signals() { std::this_thread::sleep_for(std::chrono::seconds(1) std::cout << "Notifying falsely...\n"; cv.notify_one( // waiting thread is notified with i == 0. // cv.wait wakes up, checks i, and goes back to waiting std::unique_lock<std::mutex> lk(cv_m i = 1; while (!done) { std::cout << "Notifying true change...\n"; lk.unlock( cv.notify_one( // waiting thread is notified with i == 1, cv.wait returns std::this_thread::sleep_for(std::chrono::seconds(1) lk.lock( } } int main() { std::thread t1(waits), t2(signals t1.join( t2.join( }

二次

可能的产出:

二次

Waiting... Notifying falsely... Notifying true change... ...finished waiting. i == 1

二次

另见

notify_allnotifies all waiting threads (public member function)

c CND文件[医]信号

© cppreference.com

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

http://en.cppreference.com/w/cpp/线程/条件[医]可变/通知[医]1