今天研究了下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();
使用还是很简单的~