【Linux】死锁的产生与预防

死锁:

死锁的概念:

多个线程对锁资源争抢访问,但是因为推进顺序不当,导致相互等待,造成程序无法继续,这就是死锁。

死锁的产生原因

  1. 系统资源不足:系统中所拥有的资源数量不满足多个线程的需要,使得在锁哥线程运行的过程中,因争夺资源而陷入僵局。
  2. 线程间推进顺序不当

死锁产生的四个必要条件:

  1. 互斥条件 — 同一时间锁只能有一个线程能够获取
  2. 不可剥夺条件 — 线程A加的锁只有线程A能解释放
  3. 请求与保持条件 — 线程A拿着A锁去请求B锁,若请求不到,则线程A一直保持A的锁不释放
  4. 环路等待条件(如图) —线程A请求不到B锁,线程B请求不到A锁,所以形成了一个僵局,形成一个环路等待
    在这里插入图片描述

死锁的预防:

破坏死锁的形成的必要条件,即只能破坏条件3,4。即请求与保持条件,环路等待条件。

  1. 将一个线程所用到的锁,先全部申请。一个线程完成之后,释放自己加的所有锁。然后别的线程在加锁进行它的任务。
  2. 顺序加锁。要想获取同样的锁mutex,必须得多个线程按照顺序来对锁进行申请。等前面的线程使用完mutex后,释放mutex,之后后面的线程在对锁mutex进行加锁。(事先知道所有可能用到的锁以及他们的加锁顺序)
  3. 死锁检测。当有线程去申请锁的时候,会记录下来线程与锁。当有线程申请失败,需要遍历记录中检查是否有死锁产生。若要有死锁产生,释放所有的锁,回退,并且等待一段时间后重新尝试。

死锁的避免:

银行家算法:定义三张表。第一张表示当前有哪些锁,第二张表是哪些线程都获取了哪些锁,第三张表示现在谁还要哪些锁。 然后判断,如果我把锁给了一个线程,是否会造成环路等待条件,来避免死锁。

猜你喜欢

转载自blog.csdn.net/weixin_43939593/article/details/106087978
今日推荐