关于以下代码,我的理解是线程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);
}
答案 0 :(得分:0)
我的问题是,现在的情况仍然是假的,但它 唤醒沉睡的线程,会发生什么?
这就是pthread_cond_wait
在while
循环中的原因。当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解锁互斥锁