我想以我認爲應該使用的方式使用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;
}
你爲什麼不檢查返回值的-pthread選項 - 這可能是因爲它返回一個錯誤,這就是爲什麼你循環。 – pmod 2013-04-10 20:40:06
我假設'_condMutex'是'pthread_cond_t'(variriable的名稱有點誤導,因爲condvar不是互斥鎖)並且它已被正確初始化? – 2013-04-10 20:40:12
是的你是對的,它是一個pthread_cond_t變量。 pmod,我只是打印了pthread_cond_wait的返回值 - 它是0,並且它也按照您的預期反覆打印。 – OriginalCliche 2013-04-10 20:43:05