多线程-虚假唤醒与notify与wait

介绍-虚假唤醒

孩子们,假如现在有 a b 两个线程,都调用wait方法,在montior 中的waitset中陷入等待,但是 此时 你调用了 natify方法,想让a线程运行,让b线程 等待,由于 cpu时间片是随机分配的,你无法控制 谁先抢到cpu的时间片,这时候就容易导致  

b线程 被唤醒了 ,你想要的a 线程没有被唤醒 这时候 就出现了虚假唤醒的情况

 于是我们想出来了2.0版本的方法,我是用notifyall ,把a b正在等待的线程全都给 唤醒,可是 问题又来了,我的a线程 还可能出现抢不到cpu时间片的情况,这时候到底怎么办呢孩子们?

解决方案

我们直到,当线程调用wait 等待的时候,操作系统会记录此时 该线程运行的上下文,然后等到被唤醒的时候,从该上下文处醒来 ,利用这一特性 再+while循环自旋加上 共享变量的控制,

就可以解决 虚假唤醒的情况

话不多说 我们上代码

代码实现

我们定义了三个共享变量 ,分别表示 订单 蔬菜 ,和锁

然后我们第一个线程,根据 是否有订单来判断 工作情况

我们第二个线程根据 是否有蔬菜来进行工作

现在 我们 第三个线程 控制蔬菜的存在情况,来唤醒 蔬菜线程去炒菜

  

这样即使 t1线程先抢到 cpu时间片,还会再判断 一次是否有订单 ,然后 决定是工作还是 等待

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三氧化真

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值