死锁是指两个或两个以上的进程(线程)在执行过程中,由于竞争资源或者由于彼此通信而造成 的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统 产生了死锁,这些永远在互相等待的进程(线程)称为死锁进程(线程)。
多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地 阻塞,因此程序不可能正常终止。
如下图所示,线程A持有资源2,线程B持有资源1,他们同时都想申请对方的资源,所以 这两个线程就会互相等待而进入死锁状态。
形成死锁的四个必要条件是什么
1、 互斥条件:线程(进程)对于所分配到的资源具有排它性,即一个资源只能被一个线程(进 程)占用,直到被该线程(进程)释放
2、 请求与保持条件:一个线程(进程)因请求被占用资源而发生阻塞时,对已获得的资源保持 不放。
3、 不剥夺条件:线程(进程)已获得的资源在末使用完之前不能被其他线程强行剥夺,只有自 己使用完毕后才释放资源
4、 循环等待条件:当发生死锁时,所等待的线程(进程)必定会形成一个环路(类似于死循环), 造成永久阻塞
如何避免线程死锁?
我们只要破坏产生死锁的四个条件中的其中一个就可以了。
破坏互斥条件:
这个条件我们没有办法破坏,因为我们用锁本来就是想让他们互斥的(临界资源需要互斥访问)。
破坏请求与保持条件:
一次性申请所有的资源。
破坏不剥夺条件:
占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源。
破坏循环等待条件:
靠按序申请资源来预防。按某一顺序申请资源,释放资源则反序释放。破坏循环等待条件。
Was this helpful?
0 / 0