26
目前,我正在C++ 11中使用std::thread
實現一個多線程項目。我使用std::condition_variable
來同步線程。具體來說,一個消費函數調用wait()
成員函數std::condition_variable
來等待來自全局任務隊列的任務,另一個生成器函數生成任務並將其放入隊列中。但我不知道std::condition_variable
的成員函數notify_all()
和notify_one()
之間的區別。我應該在生產者函數中使用哪個函數?謝謝!std :: condition_variable的notify_all()和notify_one()有什麼區別?
謝謝,GMan。我從互聯網上閱讀了一些文件。就像你所說的一樣。然而,通常在互斥體上使用wait()函數,例如, std :: unique_lock ul(m_mutexTask); (m_lTask.empty()){m_condTask.wait(ul); }。然後,即使notify_all()喚醒所有線程,只有一個線程可以鎖定互斥鎖,對吧? –
只有一個線程會一次鎖定互斥鎖,但一旦它們獲得互斥鎖,它們將全部從「等待」中返回。 –
@雲:使用哪一個取決於是否有任何等待的線程可以處理被等待的東西。如果有的話(例如,隊列中有多個相同的讀取器),那麼你使用notify_one,因爲這肯定更有效。如果有一個更復雜的條件,使得只有一個等待線程實際上可以成功使用循環條件,則必須喚醒所有線程,因爲無法控制哪個線程將被notify_one喚醒。 –