不管是boost库的condition_variable,仍是posix库的pthread_cond_t,使用模式基本同样。git
如:github
boost::mutex _mut; //互斥体线程
boost::condition_variable _cond; //条件变量队列
{进程
boost::mutex::scoped_lock lock(_mut): it
while(condition){ //2.为何不能用if(condition) io
_cond.wait(_mut); //1.为何要传入互斥锁 ast
} thread
}变量
1.wait方法内部,先unlock下锁, 而后阻塞进程, 要否则其余使用该互斥锁的线程将被阻塞,发生死锁;
2.为何是while(condition),而不是if(condition) ?
这是由于在notify_one()和wait返回之间,有时间差,假设在这个时间差内,还有另一个线程t改变了condition,那么t在wait()返回以后,显然应该再检查一遍condition。
建议结合openflow项目的双端队列来理解条件变量的使用。给个连接:
https://github.com/helight/openflow/blob/master/common/blocking_queue.h