2016-03-16 88 views
0

我有一個C++程序用兩種方法測試類:等待過去事件

void IntegrationTestBase::wait_test_end() { 
    unique_lock<mutex> lock(m_mutex); 

    m_cond.wait(lock); 
} 

void IntegrationTestBase::notify_test_end() { 
    XN_LOGF_ITEST_BASE(INFO, "Test end"); 

    m_cond.notify_all(); 

m_cond是一個條件變量,m_mutex是互斥。

該流程是一個未知數量的線程可能wait_test_end,然後一些其他線程可能notify_test_end,他們將停止等待。

問題是notify_test_end之後的一些其他線程可能會wait_test_end,他們將無法等待等待。

我該如何應對?

+0

我發現[這篇文章](http://stackoverflow.com/q/21757124/1460794)在尋找一個好例子時很有用。 – wally

回答

1

解決這個問題的方法是理解條件變量是什麼,什麼不是。特別是,它不是一個單一的機制。

條件變量保護某個資源(例如一個實際變量)。使用它的方式總是相同的:

  1. 鎖定互斥
  2. 檢查實際變量,看它是否包含你有興趣
  3. 值。如果沒有,等待條件變量 - 如果是,使用該變量並解鎖互斥鎖。