C++11 std::condition_variable

今天研究了下std::condition_variable,在项目中经常用到,用于wait/notify的场景,不得不说c++11 封装的东西还真不是盖的,自己要想实现一个wait/notify 的功能还不简单,里面涉及内核态的转换,让我都狠吃不消。


为什么我对这玩意比较感兴趣,从用户层来说,让线程阻塞最简单的办法就是调用sleep,但这面临一个很严重的缺陷,就是比如我sleep 5秒,但我想在第2秒的时候将线程唤醒,通过sleep是做不到的。还有个可行的办法就通过死循环再设个条件,这个是可以达成目标的,但一个可怕的问题是将消耗100%的资源。其实sleep 1毫秒,再检测条件勉强可以接受,但std::condition_variable中的wait 远远比这个占用的资源少很多很多,notify反应速度不亚于它。为嘛呢,从汇编上看,他调用win32或unix kernel,从内核中断,检测条件就几乎不消耗资源了,关于内核更复杂的东西,这也只有在以后的文章中研究讲解了。我在这就贴下std::condition_variable 使用方法吧。


mutex m; //建立一个最基本互斥对象

unique_lock<mutex> lock(m);

//lock_guard 自解锁 创建时对mutex上锁,析构时解锁

//unique_lock 可以认为是对mutex的管理,并提供了一些扩展方法和特性


condition_variable cv;

//我就写点常用的方法吧

cv.wait(unique_lock<mutex>& lock);//无限等待,直到收到notify

cv.wait_for(unique_lock<mutex>& lock,const chrono::duration<_Rep, _Period>& _Rel_time);//等待_Rel_time,超时或收到notify 继续执行

cv.notify_one();

cv.notify_all();


使用还是很简单的~


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值