条件变量-wait/wait_for

#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

—条件变量唤醒丢失和虚假唤醒

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值