#include <condition_variable>
void wait (unique_lock<mutex>& lck, Predicate pred);
(1)如果第二个参数lambda表达式返回值是true,那么wait直接返回;
如果第二个参数lambda表达式返回值是false,那么wait()解锁互斥量,阻塞在本行;一直到其他线程调用notify_one唤醒为止;
(2)如果没有第二个参数:和第二个参数lambda表达式返回false效果一样
当其他线程用notify_one将本wait的状态唤醒后:
(a)wait()不断尝试重新获取互斥量锁,如果获取不到,流程就卡在wait这里获取,如果获取到了锁,则
(b)
(b1)如果wait有第二个参数(lambda),就判断这个lambda表达式,如果lambda为false,那么wait又解锁互斥量,阻塞在本行
(b2)如果lambda表达式为true,则wait返回,流程走下来(此时互斥量还在锁着)
(b3)如果wait没有第二个参数,则wait返回,流程走下来。
bool wait_for (unique_lock<mutex>& lck, const chrono::duration<Rep,Period>& rel_time, Predicate pred);
wait_for 可以指定一个时间段,在当前线程收到通知或者指定的时间 rel_time 超时之前,该线程都会处于阻塞状态。而一旦超时或者收到了其他线程的通知,wait_for 返回,剩下的处理步骤和 wait() 类似。
需要注意的点:
达到rel_time后会唤醒一次,会判断一次pred,但是即使pred为false,也会继续往下走
不管是通过notify通知还是超时机制,都是先判断pred,如果为true,直接返回,就不阻塞了。如果为false才会阻塞等notify或者等超时
https://blog.51cto.com/u_15891800/5887770
—条件变量唤醒丢失和虚假唤醒