虚假唤醒
虚假唤醒发生在:当线程从条件变量中苏醒过来时,发现等待的条件并没有满足。之所以被称为虚假,是因为线程被无缘无故的唤醒了。但是虚假唤醒不会无缘无故地发生:虚假唤醒通常是因为,在条件变量发出信号和等待线程最终运行之间,另一个线程运行并更改了条件。线程之间存在竞争条件。典型的结果是有时在条件变量上唤醒的线程首先运行,有时则不是首先运行。
在许多系统上,尤其是多进程系统上,虚假唤醒的问题会更严重,因为如果有多个线程在等待条件变量,在发出信号的时候,系统可能会决定将它们全部唤醒,将唤醒一个线程的signal()
视为唤醒所有线程的broadcast()
,因此打破了signal()
和wakeup()
之间的1:1关系。如果有10个线程在等待条件变量,则只有1个线程能够满足条件运行,其他9个线程将经历虚假唤醒。
因为只要有竞争,甚至可能没有竞争或信号,就会发生虚假唤醒,所以,当线程从条件变量中苏醒时,线程应该检查条件是否满足。如果未满足,则线程应该继续回到该条件变量上休眠,等待其他信号苏醒。