虚假唤醒spurious wakeup

虚假唤醒

虚假唤醒发生在:当线程从条件变量中苏醒过来时,发现等待的条件并没有满足。之所以被称为虚假,是因为线程被无缘无故的唤醒了。但是虚假唤醒不会无缘无故地发生:虚假唤醒通常是因为,在条件变量发出信号和等待线程最终运行之间,另一个线程运行并更改了条件。线程之间存在竞争条件。典型的结果是有时在条件变量上唤醒的线程首先运行,有时则不是首先运行。

在许多系统上,尤其是多进程系统上,虚假唤醒的问题会更严重,因为如果有多个线程在等待条件变量,在发出信号的时候,系统可能会决定将它们全部唤醒,将唤醒一个线程的signal()视为唤醒所有线程的broadcast(),因此打破了signal()wakeup()之间的1:1关系。如果有10个线程在等待条件变量,则只有1个线程能够满足条件运行,其他9个线程将经历虚假唤醒。

因为只要有竞争,甚至可能没有竞争或信号,就会发生虚假唤醒,所以,当线程从条件变量中苏醒时,线程应该检查条件是否满足。如果未满足,则线程应该继续回到该条件变量上休眠,等待其他信号苏醒。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值