我试图围绕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语句?
答案 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语句?
条件变量背后的想法是暂停线程执行,直到满足给定条件。但是,条件并没有内置到变量中 - 它必须由程序员提供。
如果相关条件已经满足,则无需暂停操作。然而,这里的关键是当线程恢复时,条件可能仍然不满足,因为在发出信号的条件变量和线程能够继续之间发生了某些变化,或者因为线程激动地醒来(这是允许发生的,尽管它很少发生)。因此,程序在每次唤醒时再次检查条件,看它是否必须重新等待。