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

std::condition_variable::wait

性病:情况[医]变量::等待

void wait( std::unique_lock& lock (1)(since C++11)
template< class Predicate > void wait( std::unique_lock<std::mutex>& lock, Predicate pred (2)(since C++11)

wait导致当前线程阻塞,直到通知条件变量或出现虚假唤醒为止,还可以选择循环直到满足某个谓词。

1%29原子释放lock,阻止当前正在执行的线程,并将其添加到等待执行的线程列表中。*this.线程将在notify_all()notify_one()被处决了。它也可能是伪造的。不管原因是什么,lock重新获得和wait出口。如果此函数通过异常退出,lock也被重新获得。%28直到C++14%29

2%29相当于

二次

while (!pred()) { wait(lock }

二次

这种过载可能被用来忽略虚假的唤醒,而等待特定的条件成为现实。请注意,在输入此方法之前lock必须获得,之后wait(lock)退出也会被重新获取,即lock可以用作警卫pred()进入。

If these functions fail to meet the postconditions (lock.owns_lock()==true and lock.mutex() is locked by the calling thread), std::terminate is called. For example, this could happen if relocking the mutex throws an exception,(since C++14)

参数

lock-an object of type std::unique_lock, which must be locked by the current thread
pred-predicate which returns ​false if the waiting should be continued. The signature of the predicate function should be equivalent to the following: bool pred(​

返回值

%280%29

例外

1%29

May throw std::system_error, may also propagate exceptions thrown by lock.lock() or lock.unlock().(until C++14)
Does not throw.(since C++14)

2%29与%281%29相同,但也可能传播由pred

注记

调用此函数如果lock.mutex()不被当前线程锁定是未定义的行为。

调用此函数如果lock.mutex()与当前正在等待相同条件变量的所有其他线程使用的互斥对象不同,这是未定义的行为。

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

二次

#include <iostream> #include <condition_variable> #include <thread> #include <chrono> std::condition_variable 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

二次

另见

wait_forblocks the current thread until the condition variable is woken up or after the specified timeout duration (public member function)
wait_untilblocks the current thread until the condition variable is woken up or until specified time point has been reached (public member function)

c CND文件[医]等待

© cppreference.com

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

http://en.cppreference.com/w/cpp/线程/条件[医]可变/等待