Linux:死锁与解决方法

死锁

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

死锁现象:

  • 现象1,如果执行流加锁完毕后,不进行解锁则会造成死锁(上篇所述);
  • 现象2,线程A获取了1锁,线程B获取了2锁,同时线程A还想获取2锁,线程B还想获取1锁

现象2模拟:


在这里插入图片描述在这里插入图片描述
两个线程都处于阻塞状态

死锁的必要条件

只要产生死锁,这四个条件一定会出现

  1. 互斥:一个执行流获取互斥锁后,其它执行流不能再获取该锁
  2. 不可剥夺:A执行流拿着锁,未使用完之前不能被强行剥夺
  3. 循环等待:多个执行流拿着对方想要的锁,并且各执行流还去请求对方的锁
  4. 请求与保持:执行流本身使用着一把锁并不释放,还在请求别的锁

解决方案:

  1. 使线程的加锁顺序一致
    在这里插入图片描述

  1. 破坏环路等待条件
    使用非阻塞锁,一旦线程发现请求的锁被使用,就去释放自己拥有的锁
    在这里插入图片描述

  1. 在加锁前,将临界资源一次性分配给线程A再加锁

try锁:pthread_mutex_try
申请锁失败,错误码会返回
非阻塞锁,申请失败会立即返回

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值