包含pthread_cond_wait的while循环的行为是什么?

时间:2019-05-12 04:16:53

标签: c pthreads spurious-wakeup

我想知道在等待线程唤醒后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()是必需的?

1 个答案:

答案 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?