关于pthread_cond_wait的用法

时间:2016-12-21 21:39:31

标签: c multithreading pthreads condition-variable

我试图围绕pthread条件变量。 我看过一些使用pthread_cond_wait和pthread_cond_signal的代码示例,所有这些示例都是这样的:

while (condition)
{
    // Assume that the mutex is locked before the following call
    pthread_cond_wait(&cond, &mutex);
}

是否有理由在条件下使用while循环?为什么不只使用一个if语句?

3 个答案:

答案 0 :(得分:1)

我认为这是因为在满足条件之前,线程可能会被虚假地唤醒。伙计,谈论“陷阱”。

来自Open Group文档:
“可能会发生来自pthread_cond_wait()或pthread_cond_timedwait()函数的虚假唤醒。”

来源:
http://pubs.opengroup.org/onlinepubs/007908775/xsh/pthread_cond_wait.html

答案 1 :(得分:1)

虚假的唤醒。

请参阅Why does pthread_cond_wait have spurious wakeups?以及https://en.wikipedia.org/wiki/Spurious_wakeup

  

虚假唤醒描述了某些多线程API(如POSIX)提供的条件变量使用的复杂性   线程和Windows API。

     

即使条件变量似乎已从a发出信号   等待线程的观点,等待的条件可能   仍然是假的。造成这种情况的原因之一是虚假的唤醒;那   是的,一个线程可能会从等待状态唤醒,即使没有   线程发出条件变量的信号。为了正确,它是   然后,必须验证条件确实是真的   线程已经完成等待。因为虚假的唤醒可能发生   反复,这是通过在一个终止循环内等待来实现的   当条件成立时......

答案 2 :(得分:1)

  

是否有理由在条件下使用while循环?为什么不只使用一个if语句?

条件变量背后的想法是暂停线程执行,直到满足给定条件。但是,条件并没有内置到变量中 - 它必须由程序员提供。

如果相关条件已经满足,则无需暂停操作。然而,这里的关键是当线程恢复时,条件可能仍然不满足,因为在发出信号的条件变量和线程能够继续之间发生了某些变化,或者因为线程激动地醒来(这是允许发生的,尽管它很少发生)。因此,程序在每次唤醒时再次检查条件,看它是否必须重新等待。