引用手册:
当使用条件变量时,每个条件等待都会涉及与共享变量相关联的布尔谓词,如果线程应该继续,则该谓词为真。可能发生从pthread_cond_timedwait()或pthread_cond_wait()函数的虚假唤醒。由于从pthread_cond_timedwait()或pthread_cond_wait()返回并不意味着该谓词的值,因此应在此类返回后重新评估该谓词。
所以,即使您没有发出信号,pthread_cond_wait
也可能会返回。乍一看,这似乎相当可怕。这就像一个随机返回错误值或在实际到达适当返回语句之前随机返回的函数。它似乎是一个重大的漏洞。但是,他们选择在手册中记录这一点而不是修复它似乎表明pthread_cond_wait
最终会无意地唤醒的原因是合法的。大概有关于它如何工作的内在因素使得它不能被避免。问题是什么。
为什么pthread_cond_wait
会出现虚假唤醒?为什么它不能保证只有在被正确通知时才会被唤醒?有人能解释一下它的虚假行为的原因吗?
pthread_cond_(timed)wait
来说并不是一个错误:“如果传递了信号...线程将恢复等待条件变量的状态,就好像没有被中断一样,或者它将返回由于虚假唤醒而导致的零值”。其他阻塞函数在被信号中断时会指示EINTR
(例如read
),或者需要恢复(例如pthread_mutex_lock
)。因此,如果没有其他虚假唤醒的原因,pthread_cond_wait
可以像这些函数之一那样定义。 - Steve Jessop