我想知道在等待线程唤醒后while
会发生什么。
为避免“虚假唤醒”,pthreads
文档指出,您需要在pthread_cond_wait
语句中使用while
。
因此,在调用pthread_cond_wait
时,调用线程被阻塞。并在发出信号后,线程在while
内部恢复。
在我的代码中,我正在这样处理pthread_cond_wait()
:
pthread_mutex_lock(&waiting_call_lock);
while(1) {
pthread_cond_wait(&queue_cond[thread_ctx], &waiting_call_lock);
break;
}
pthread_mutex_unlock(&waiting_call_lock);
问题是,它将尝试再次输入一会儿或以某种方式break
进入一会儿并继续吗?还是在这种情况下,在break
之后的pthread_cond_wait()
是必需的?
答案 0 :(得分:2)
为正确起见,我认为最好从问自己:“线程在等待什么?”
答案不应该是“它应该等待另一个线程发出信号”,因为条件变量的工作方式是假定您还有其他要等待的线程互斥保护信息。 >
为了说明这一点,我将在这里创建一个示例,其中线程应该等待,直到名为counter
的变量大于7。变量counter
可以被多个线程访问,并受一个线程保护。我将称为theMutex
的互斥量。然后,涉及pthread_cond_wait
调用的代码如下所示:
pthread_mutex_lock(&theMutex);
while(counter <= 7) {
pthread_cond_wait(&cond, &theMutex);
}
pthread_mutex_unlock(&theMutex);
现在,如果发生“虚假唤醒”,程序将再次检查条件(counter <= 7)
并发现它仍然不满足,因此它将停留在循环中并调用{{1} }。因此,这可以确保线程在满足条件之前不会经过while循环。
由于在实践中很少发生虚假唤醒,因此触发检查您的实现是否正常工作可能会很有趣。这是关于此的讨论:How to trigger spurious wake-up within a Linux application?