不管是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