引用手册页:
使用条件变量时,总是存在一个布尔谓词,其中涉及与每个条件等待相关联的共享变量,如果线程应该继续执行,则为true。从pthread_cond_timedwait()或pthread_cond_wait()函数可能会引起虚假的唤醒。由于pthread_cond_timedwait()或pthread_cond_wait()的返回并不暗示此谓词的值,因此应在返回时重新评估该谓词。
因此,pthread_cond_wait
即使您未发出信号也可以返回。至少乍一看,这似乎很残酷。就像一个函数,它随机返回错误的值,或者在它真正到达正确的return语句之前随机返回。似乎是一个重大错误。但是他们选择在手册页中记录而不是修复它的事实似乎表明,有一个正当的理由导致pthread_cond_wait
虚假地醒来。据推测,它的工作方式具有内在的本质,使它无济于事。问题是什么。
为什么会pthread_cond_wait
虚假归还?为什么不能保证只有在正确发出信号后才能唤醒它?谁能解释其伪造行为的原因?
pthread_cond_(timed)wait
:“如果传递了信号,则线程将继续等待条件变量,就像是不中断,否则由于虚假唤醒它将返回零”。其他阻止功能指示EINTR
何时被信号中断(例如read
)或需要恢复(例如pthread_mutex_lock
)。因此,如果没有其他原因导致虚假唤醒,则pthread_cond_wait
可以像上述两种情况一样进行定义。