條件變量

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

相關文章
相關標籤/搜索