【Linux操作系统】死锁


有两个小朋友站在超市的零食区,手上各拿着五毛钱,他们直勾勾的看着眼前的棒棒糖,问了问阿姨,这个棒棒糖要一块钱。所以a对b说:“你把你的五毛钱给我买棒棒糖”,b不乐意了,说:“凭什么,你把你的五毛钱给我,我买棒棒糖”,然后呢,这两个小朋友就在超市一直争执,谁都不想把自己手中的五毛钱让出去。那么在这个场景中,两个小朋友就是两个线程,他们两人手上的五毛钱就相当于临界锁,棒棒糖相当于临界资源,超市的阿姨相当于OS操作系统。

死锁的概念

死锁是指在一组进程中的各个进程均占用不会释放的资源,但因互相申请被其它进程所占用的不会释放的资源而处于一种永久等待的状态。

一把锁可能产生死锁吗?

可能。程序员申请一把锁,访问临界资源,本来该释放,结果写错了,他又写成申请一把锁,所以一个执行流同时申请同一把锁,申请两次的时候,当他在第二次申请锁的时候,就挂起了,自己就把自己死锁了。所以一把锁的情况也可能出现死锁。这就是“骑驴找驴了”。

产生死锁问题的必要条件

  1. 互斥条件:一个资源每次只能被一个执行流使用。
  2. 请求与保持:一个执行流因请求资源而阻塞时,对已获得的资源保持不放。回到最开始讲的小故事,a请求b给他五毛钱,但是a手上还拿着五毛钱,即一个线程申请锁,当时它的锁还未释放,这就叫做请求和保持。
  3. 环路等待(循环等待条件):若干执行流之间形成一种头尾相接的循环等待资源的关系。
  4. 不剥夺条件:一个执行流已获得的资源,在未使用完之前,不能强行剥夺。

如何避免死锁

核心思想:破坏死锁的4个必要条件之一

1.不加锁(破坏互斥条件)
2.主动释放锁,避免锁未释放的场景(破坏请求与保持)
3.按顺序申请锁(破坏环路等待条件)
4.控制线程统一释放锁,资源一次性分配(在以下测试代码中,主线程是可以控制其它线程锁的释放的)

ps:加锁和解锁不一定非要在一个线程内进行,可以跨进程!

在这里插入图片描述

在这里插入图片描述

运行结果:
在这里插入图片描述

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_麦子熟了

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

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

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

打赏作者

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

抵扣说明:

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

余额充值