pthread_cond_wait没有做我期待的
问题描述:
我想以我认为应该使用的方式使用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;
}
答
编译到g ++
+0
ahhhhh!这一定是它。我在搞清楚ideone,并没有通过这个选项。我将在明天在linux上写下它,并在那里建立它,然后回报。谢谢 – OriginalCliche 2013-04-10 23:03:31
你为什么不检查返回值的-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