多线程对全局变量操作的bug

多线程对全局变量同时操作会出现bug,怎么解决呢

答案就是:原子性(要么别做,要么做完)

为了保证某个线程先做完,给函数加个判断条件似乎可行,如图,但是这样开启两个线程后,test2进行一次判断,就终止了,也就是说test1执行完后,test2不会再进行判断条件。那么怎么让test2等待test1执行完,再进行判断条件呢?
在这里插入图片描述加个死循环(轮询即循环判断),一直判断条件似乎可行。
在这里插入图片描述虽然可以达到效果,但是test2依旧在占用cpu做无用功,导致效率不高

互斥锁(把轮询改成通知使得test1执行时,test2等待被通知,处于休眠状态,不占cpu)

条件不满足处于堵塞等待状态,只要一个线程上了锁,别的线程就要等待,直到上锁的线程处理完,开锁后。

![在这里插入图片描述](https://img-blog.csdnimg.cn/20191230105748676.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpa2Vfc3R1ZHlfY2F0,size_16,color_FFFFFF,t_70
但是这样似乎从多任务变成了单任务模式,因为test1和test2抢着上锁,假如某一个上了锁,另一个就处于睡眠等待状态。

互斥锁总结:

多线程对同一个资源进行操作的时候需要加锁,锁加在哪呢,原则上是能不枷锁就不加锁,加锁的区域越小越好,就像3车道过单车道的收费站一样,希望收费站越小越好,这样才能保证3辆车以最快的速度到达目的地。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值