2012-01-26 103 views
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()有什麼區別?

回答

22

如果在條件變量上有十個線程被阻塞,例如,notify_one()將只解鎖一個線程,而notify_all()將全部解除阻塞。在你的情況下,你會想要使用notify_one(),所以你不會喚醒沒有任何工作等待的線程。

+1

謝謝,GMan。我從互聯網上閱讀了一些文件。就像你所說的一樣。然而,通常在互斥體上使用wait()函數,例如, std :: unique_lock ul(m_mutexTask); (m_lTask​​.empty()){m_condTask.wait(ul); }。然後,即使notify_all()喚醒所有線程,只有一個線程可以鎖定互斥鎖,對吧? –

+6

只有一個線程會一次鎖定互斥鎖,但一旦它們獲得互斥鎖,它們將全部從「等待」中返回。 –

+13

@雲:使用哪一個取決於是否有任何等待的線程可以處理被等待的東西。如果有的話(例如,隊列中有多個相同的讀取器),那麼你使用notify_one,因爲這肯定更有效。如果有一個更復雜的條件,使得只有一個等待線程實際上可以成功使用循環條件,則必須喚醒所有線程,因爲無法控制哪個線程將被notify_one喚醒。 –

相關問題