【发布时间】:2012-01-25 13:07:02
【问题描述】:
引用手册页:
当使用条件变量时,总是有一个布尔谓词涉及与每个条件相关的共享变量等待如果线程应该继续,则该条件等待为真。可能会发生来自 pthread_cond_timedwait() 或 pthread_cond_wait() 函数的虚假唤醒。由于 pthread_cond_timedwait() 或 pthread_cond_wait() 的返回并不暗示此谓词的值,因此应在返回时重新评估谓词。
所以,pthread_cond_wait 可以返回,即使你没有发出信号。至少乍一看,这似乎很残酷。这就像一个随机返回错误值或在实际到达正确的返回语句之前随机返回的函数。这似乎是一个重大错误。但他们选择在手册页中记录这一点而不是修复它的事实似乎表明pthread_cond_wait 最终被虚假唤醒是有正当理由的。据推测,它的工作原理有一些内在的东西使它无法帮助。问题是什么。
为什么pthread_cond_wait 会虚假返回?为什么它不能保证只有在收到正确的信号时才会醒来?谁能解释其虚假行为的原因?
【问题讨论】:
-
我想它与进程捕获信号时返回有关。大多数 *nixes 在信号中断后不会重新启动阻塞调用;他们只是设置/返回一个错误代码,表明发生了信号。
-
@cHao:虽然请注意,因为条件变量有其他原因导致虚假唤醒,处理信号对于
pthread_cond_(timed)wait来说不是错误:“如果信号被传递......线程继续等待条件变量,就好像它没有被中断一样,或者由于虚假唤醒它应该返回零”。其他阻塞函数在被信号中断(例如read)或需要恢复(例如pthread_mutex_lock)时指示EINTR。因此,如果没有其他原因导致虚假唤醒,pthread_cond_wait可能会被定义为其中任何一个。 -
维基百科的相关文章:Spurious wakeup
-
许多函数不能完全完成它们的工作(中断的 I/O)并且观察函数可以接收到非事件,比如更改被取消或恢复的目录的更改。有什么问题?