关于pthread_cond_wait的混淆

时间:2015-09-28 02:47:51

标签: c multithreading

关于以下代码,我的理解是线程1抓住锁,检查条件,解锁时钟,将自己设置为睡眠状态。然后,线程2声明相同的锁定和增量计数,然后唤醒睡眠线程。我的问题是,现在的情况仍然是假的,但它唤醒了沉睡的线程,会发生什么?而且条件变量也是一组线程,那么如果有很多线程同时执行代码,那么wait()如何处理这种情况呢?最后请解释一下这段代码的正确执行顺序,非常感谢!!!

thread 1:
    pthread_mutex_lock(&mutex);
    while (!condition)
        pthread_cond_wait(&cond, &mutex);
    /* do something that requires holding the mutex and condition is true */
    pthread_mutex_unlock(&mutex);

thread2:
  while(1){
     pthread_mutex_lock(&mutex);
     count++;
     pthread_cond_signal(&cond);
     pthread_mutex_unlock(&mutex);
  }

2 个答案:

答案 0 :(得分:0)

  

我的问题是,现在的情况仍然是假的,但它   唤醒沉睡的线程,会发生什么?

这就是pthread_cond_waitwhile循环中的原因。当while取消阻止并且条件为真时,它才会退出pthread_cond_wait循环。

这正是pthread_cond_wait man page需要完成的注意事项。

  

使用条件变量时,总会有一个布尔谓词   涉及与每个条件等待关联的共享变量   如果线程应继续,则为true。来自的虚假唤醒   可能会发生pthread_cond_timedwait()或pthread_cond_wait()函数。   从pthread_cond_timedwait()或pthread_cond_wait()返回   并不意味着关于这个谓词的价值,   应该在返回时重新评估谓词。

(强调我的)。

答案 1 :(得分:0)

1)线程1锁定互斥锁 2)线程1解锁互斥锁(使用pthread_cond_wait) 3)Thtead 2锁定互斥锁 4)线程2解锁互斥锁并发送信号(pthraed_cond_signal)5)线程1将互斥锁返回 6)线程1解锁互斥锁