2013-04-10 49 views
0

我想以我認爲應該使用的方式使用pthread_cond_wait。我在一個方法中使用它,它正在等待某些東西發生變化,當它發生變化時,它會調用另一種方法來獲取數據。它看起來像如下:pthread_cond_wait沒有做我期待的

void waitForSomething(const std::string& _str) { 

    //lock my mutex here 

    while (!ifStringInSomeCollection(_str)) { 
      std::cout << "waiting.." << std::endl; 
      pthread_cond_wait(&_condMutex, &_myMutex); 
    } 
    //unlock my mutex here 

    //this method also acquires my mutex lock 
    std::cout << getData(_str) << std::endl; 
} 

現在我將打破條件和廣播等方法/信號的等待狀態時,我第一次解鎖廣播/信號之前互斥 - 所以這不應該是一個問題。

但即使沒有這個,現在發生的情況是,它不斷檢查while循環中的條件而不是pthread_cond_wait - 實際上正在等待。我一直堅持這一段時間,任何想法將不勝感激。謝謝!

==================

討論之後,我寫了下面的測試,得到的條件在測試情況等。我仍然重複「鎖定」消息。我一定做錯了什麼? http://ideone.com/eVuKEC

#include<pthread.h> 
#include <iostream> 

pthread_mutex_t mutex; 
pthread_cond_t cond; 
bool something; 

void test() { 
    pthread_mutex_lock(&mutex); 
    while(!something) { 
     std::cout <<"locked" << std::endl; 
     pthread_cond_wait(&cond,&mutex); 
    } 
    pthread_mutex_unlock(&mutex); 
} 

int main(){ 
    pthread_mutex_init(&mutex, NULL); 
    pthread_cond_init(&cond, NULL); 
    something=false; 
    test(); 
    return 0; 
} 
+1

你爲什麼不檢查返回值的-pthread選項 - 這可能是因爲它返回一個錯誤,這就是爲什麼你循環。 – pmod 2013-04-10 20:40:06

+0

我假設'_condMutex'是'pthread_cond_t'(variriable的名稱有點誤導,因爲condvar不是互斥鎖)並且它已被正確初始化? – 2013-04-10 20:40:12

+0

是的你是對的,它是一個pthread_cond_t變量。 pmod,我只是打印了pthread_cond_wait的返回值 - 它是0,並且它也按照您的預期反覆打印。 – OriginalCliche 2013-04-10 20:43:05

回答

2

編譯到g ++

+0

ahhhhh!這一定是它。我在搞清楚ideone,並沒有通過這個選項。我將在明天在linux上寫下它,並在那裏建立它,然後回報。謝謝 – OriginalCliche 2013-04-10 23:03:31