(1)什么是死锁:
-
死锁 是指在两个或多个进程的执行时,每个进程都持有资源 并 等待其他进程 释放 它所需的资源,如果此时所有的进程一直占有资源而不释放,就会陷入互相等待的一种僵局状态。
-
死锁只有同时满足 四个条件时才会发生:
-
互斥:也就是 这块资源 只能被一个进程获取
-
请求并保持:进程因为请求资源而阻塞了,同时它也不会释放自己的资源
-
不可剥夺:资源只能由持有者 自愿释放,不能强行剥夺
-
循环等待:线程 A 已经持有资源 2,而想请求资源 1, 线程 B 已经获取了资源 1,而想请求资源 2,这就形成资源请求等待的环形图。
-
-
死锁的几种场景:
-
忘记释放锁(自己不能再用了,其他线程也不能用)
-
重复加同一个锁 (往往是在被锁定的代码区内调用函数,而那个函数内部也有同一个锁,这种错误就比较隐蔽了)
-
多线程多锁,抢占锁资源(线程之间互相需要对方的锁,但是都给不了)
-
(2)如何避免死锁:
通过 破坏死锁的四个必要条件之一 来预防死锁。
- 破坏 互斥条件:使得多个进程可以同时访问 同一个资源。例如,在内存中缓存某些资源,从而避免频繁的磁盘读写。
- 破坏 不可抢占条件:当一个进程所持有的资源被其它进程请求时,可以强制该进程放弃资源
- 破坏 请求与保持条件:进程在申请新资源之前先释放它所拥有的所有资源,等待新资源的分配,再重新申请先前持有的资源。
- 破坏循环等待条件:通过给资源编号,规定每个进程按编号的顺序请求资源,释放资源的顺序与请求的顺序相反,从而避免循环等待。
- 另外:
- 设置超时时间:如果一个进程不能在一定时间内获得所需的所有资源,就应该释放已经获取的资源,以免造成系统资源的浪费。