c++ 学习之 多线程(八)条件变量condition_variable

condition_variable成员函数

condition_variable 是 c++11 提供的一个可以实现线程同步的类。下面来总结一下条件变量condition_variable的用法。

1. condition_variable::wait()

成员函数wait()需要与unique_lock搭配使用。wait()函数有两种调用方法。

(一)void wait (unique_lock& lck);

只有一个参数,传入一个unique_lock对象就可以了。 condition_variable对象调用wait ()函数后,该线程会休眠,并且释放unique_lock对象所占有的锁。直到同一对象调用 notify_one() 或者 notify_all() ,该线程会被唤醒,并且不断去获取unique_lock对象的锁,直到获取成功,函数返回。

(二)template <class Predicate> void wait (unique_lock& lck, Predicate pred);

需要两个参数,第一个参数传入一个unique_lock对象,第二个参数需要传入一个可调用对象(函数,lambda表达式等)。调用wait()函数时,会先拿到unique_lock的锁,接着判断可调用对象的返回值是否为true,若为true函数返回,否则释放掉unique_lock对象所占有的锁,然后该线程休眠,直到同一对象调用 notify_one() 或者 notify_all() ,该线程会被唤醒,然后不断去获取unique_lock对象的锁,直到获取成功再次判断可调用对象的返回值真假,为true函数返回,为false再次休眠,直到下一次唤醒。

2.condition_variable::notify_one()

condition_variable对象调用notify_one()来唤醒任意一个被该对象wait()函数阻塞的线程。如果没有线程被该对象wait()函数阻塞,就什么也不做。
注意,只能唤醒同一对象的wait函数,而且是任意一个,当有多个线程线程被该对象wait()函数阻塞时,无法确定是哪一个被唤醒。

3. condition_variable::notify_all()

和condition_variable::notify_one()功能一致,区别在于condition_variable::notify_all()可以唤醒所有的被该对象阻塞的线程。

还有成员函数 condition_variable::wait_for()和condition_variable::wait_until()这里不做详细解释。

condition_variable 的使用

首先看一下用双重检查模拟多线程的队列缓冲区维护。

#include<thread>
#include<mutex>
#include<queue>
#include<stdio.h>
using namespace std;
queue
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值