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; 
} 
+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

编译到g ++

+0

ahhhhh!这一定是它。我在搞清楚ideone,并没有通过这个选项。我将在明天在linux上写下它,并在那里建立它,然后回报。谢谢 – OriginalCliche 2013-04-10 23:03:31