条件变量之虚假唤醒

当线程从等待已发出信号的条件变量中醒来,却发现它等待的条件不满足时,就会发生虚假唤醒。之所以称为虚假,是因为该线程似乎无缘无故地被唤醒了。但是虚假唤醒不会无缘无故发生:它们通常是因为在发出条件变量信号和等待线程最终运行之间,另一个线程运行并更改了条件。线程之间存在竞争条件,典型的结果是有时,在条件变量上唤醒的线程首先运行,赢得竞争,有时它运行第二,失去竞争。
在许多系统上,尤其是多处理器系统上,虚假唤醒的问题更加严重,因为如果有多个线程在发出信号时等待条件变量,系统可能会决定将它们全部唤醒,将每个signal( )唤醒一个线程视为broadcast( )唤醒所有这些,从而打破了信号和唤醒之间任何可能预期的 1:1 关系。如果有 10 个线程在等待,那么只有一个会获胜,另外 9 个会经历虚假唤醒。
为了让实现在处理操作系统内部的错误条件和竞争时具有灵活性,即使没有发出信号,也可以允许条件变量从等待中返回,尽管目前尚不清楚有多少实现实际这样做。在条件变量的 Solaris 实现中,如果进程发出信号,则可能会发生虚假唤醒而没有发出条件信号;等待系统调用中止并返回EINTR。条件变量的 Linux pthread 实现保证它不会那样做。
因为只要有竞争甚至可能在没有竞争或信号的情况下都可能发生虚假唤醒,因此当线程在条件变量上唤醒时,它应该始终检查它所寻求的条件是否得到满足。如果不是,它应该回到条件变量上睡觉,等待另一个机会。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值