ZackSungy

导航

遇到死锁和解决死锁的方式

造成死锁的原因

讲到造成死锁的原因,离不开以下四个必要条件:

  • 互斥:某种资源一次只允许一个进程访问,即该资源一旦分配给某个进程,其他进程就不能再访问,直到该进程访问结束。
  • 占有且等待:一个进程本身占有资源,同时还有资源未得到满足,正在等待其他进程释放该资源。
  • 不可抢占:别人已经占有了某项资源,你不能因为自己也需要该资源,就去把别人的资源抢过来。
  • 循环等待:存在一个进程链,使得每个进程都占有下一个进程所需的至少一种资源。
    假设一个进程有两个线程分别是线程A和进程B

如图所示,线程A和线程B一开始分别获取资源A和资源B,并锁定资源A与资源B。当线程A执行需要使用线程B的时候,发现资源B正在被使用,此时线程A执行不了下一步,则选择了原地停止等待,直到资源B解锁然后获取资源B。在线程A锁定资源A之后的某一个时刻,线程B也需要使用到资源A,但此时资源A处于锁定状态,线程B获取不了资源A,也选择了停止等待。此时线程A与线程B都处于停止等待状态,所以发生了死锁。

注意:上面是死锁的发生的其中一个例子,满足四大必要条件的全部条件才会触发死锁。

解决死锁的方式

破坏死锁的思路也很简单,只要将4个必要条件破除就可以了
*破坏互斥:如果这种情况破除的话,对可读可写的资源来说,会破坏数据的唯一性。所以只可以对只读的数据使用。
*破坏占有并等待:就是当占有一个资源时候并需要使用其他资源时,主动解除占有的资源并从新运行(有限次数)或者退出程序,使用上面的例子解析就是线程A占用了资源A,当需要获取资源B的时候,停止对资源A的占用,从新运行线程A再试锁定资源A,此时如果线程B运行时发现资源A可以使用了,就不会发生堵塞,解除了死锁,对于线程B来说同理,只需要一个固定的判断顺序执行即可。
*破坏不可抢占:当需要使用到其他资源且其他资源被锁定时,要求其他线程退出这个资源的锁定自己占用此资源。使用上面的例子解析就是线程A的占用了资源A,当线程A需要使用到资源B的时候(此时,需要有一个先后顺序,假设线程A需要资源B的时间戳比线程B需要资源A的时间戳要小),线程A就会去通知线程B资源B这个资源需要使用,此时,线程B就会放弃资源B的抢占。
*破坏循环等待:也叫“固定顺序锁定”,即无论是线程A跑还是线程B跑资源的抢占顺序,都是按照一个固定的方式去抢占。使用上面的例子解析就是,线程A或者线程B去抢占资源A或者资源B,都只能固定先抢占资源A或者先抢占资源B,不可以线程A先抢占了资源A,而且线程B先资源B的情况出现。

**以上是我对死锁造成原因及解决方式的总结,如果有更好的方法,或者说的不对的地方,欢迎大佬们提出!!

posted on 2022-09-18 22:44  ZackSungy  阅读(287)  评论(0编辑  收藏  举报