std::condition_variable_any::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_any 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_all | notifies all waiting threads (public member function) |
---|
c CND文件[医]信号
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。