小林图解系统-五.进程管理 5.4.怎么避免死锁?

死锁的概念

多线程编程中国,为了防止多线程竞争共享资源而导致数错乱,都会在操作共享资源之前加上互斥锁,只有成功获得锁的线程,才能操作共享资源,获取不到锁的线程就只能等待,直到锁被释放。

当两个线程为了保护两个不同的共享资源而使用了两个互斥锁,那么这两个互斥锁应用不当的时候,会造成两个线程都在等待对方释放锁,在没有外力的作用下,这些线程会一直相互等待,没办法继续运行,这种情况就是发生了死锁

死锁只有同时满足四个条件才会发生:

  • 互斥条件
  • 持有并等待条件
  • 不可剥夺条件
  • 环路等待条件

互斥条件

多个线程不能同时使用同一个资源

持有并等待条件

线程 A 在等待资源 2 的同时并不会释放自己已经持有的资源 1

不可剥夺条件

在自己使用完之前不能被其他线程获取

环路等待条件

两个线程获取资源的顺序构成了环形链


利用工具排查死锁问题

pstack + gdb 工具来定位死锁问题。我们可以多次执行 pstack 命令查看线程的函数调用过程,多次对比结果,确认哪几个线程一直没有变化,且是因为在等待锁,那么大概率是由于死锁问题导致的。


避免死锁问题的发生

使用资源有序分配法,来破环环路等待条件

线程 A 和 线程 B 获取资源的顺序要一样,当线程 A 是先尝试获取资源 A,然后尝试获取资源 B 的时候,线程 B 同样也是先尝试获取资源 A,然后尝试获取资源 B。也就是说,线程 A 和 线程 B 总是以相同的顺序申请自己想要的资源。


总结

简单来说,死锁问题的产生是由两个或者以上线程并行执行的时候,争夺资源而互相等待造成的。

死锁只有同时满足互斥、持有并等待、不可剥夺、环路等待这四个条件的时候才会发生。

所以要避免死锁问题,就是要破坏其中一个条件即可,最常用的方法就是使用资源有序分配法来破坏环路等待条件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值