C++11 std::condition_variable

来源:互联网 发布:大华网络监控远程设置 编辑:程序博客网 时间:2024/05/16 14:09

今天研究了下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();


使用还是很简单的~


阅读全文
0 0