引用手册页:
当使用条件变量时,总是有一个布尔谓词涉及与每个条件相关联的共享变量等待如果线程应该继续,则该条件等待为真。可能会发生来自 pthread_cond_timedwait() 或 pthread_cond_wait() 函数的虚假唤醒。由于 pthread_cond_timedwait() 或 pthread_cond_wait() 的返回并不暗示该谓词的任何值,因此应在此类返回时重新评估谓词。
因此,pthread_cond_wait即使您没有发出信号,也可以返回。至少乍一看,这似乎很残酷。这就像一个随机返回错误值或在实际到达正确的返回语句之前随机返回的函数。这似乎是一个重大错误。但是他们选择在手册页中记录这一点而不是修复它的事实似乎表明有一个合理的原因导致pthread_cond_wait最终被虚假唤醒。据推测,它的工作原理有一些内在的东西使它无法帮助。问题是什么。
pthread_cond_wait
为什么会pthread_cond_wait虚假返回?为什么它不能保证只有在收到正确的信号时才会醒来?谁能解释其虚假行为的原因?
至少有两件事“虚假唤醒”可能意味着:
pthread_call_signal
pthread_cond_broadcast
pthread_cond_signal
但是即使条件变量实现不允许前一种情况,后一种情况也可能发生。考虑一个生产者消费者队列和三个线程。
因此,由于您已经总是需要检查循环下的谓词,因此底层条件变量是否可以具有其他类型的虚假唤醒没有区别。