1, 什么是死锁?
2, 死锁是如何产生的?
3, 如何避免死锁?
1. 什么是死锁
死锁的规范定义
- 集合中的每一个进程都在等待只能由本集合中的其他进程才能引发的事件,那么该组进程是死锁的。
一种情形
- 执行程序中两个或多个线程发生永久堵塞(等待)
- 每个线程都在等待被其他线程占用并堵塞了的资源。
例如
- 如果线程A锁住了记录1并等待记录2,而线程B锁住了记录2并等待记录1,这样两个线程就发生了死锁现象
通俗点来讲
- 比如两个人吃饭只有一双筷子
- 一个人拿左筷子, 一个人拿右筷子,两个人都在等对方的筷子, 这样两个人都没办法吃饭, 就造成了死锁
这种情况可能发生在
- 当两个线程尝试获取其他资源的锁,而每个线程又陷入无限等待其他资源锁的释放时,除非一个用户的进程被终止,否则就会产生死锁
线程死锁可能发生在以下的情况
- 当两个线程相互调用
int pthread_join(pthread_t thread, void **retval);
- 当两个线程使用嵌套的同步块时,一个线程占用了另一个线程必需的锁,互相等待时被阻塞,就有可能出现死锁
死锁的危害
说了半天, 死锁究竟会产生什么后果呢?
当出现死锁时,进程永远不能完成,并且阻碍使用系统资源,阻止了其他作业开始执行,导致系统的资源利用率急剧下载,下面列举出一些比较直接的影响。
- 死锁会使进程得不到正确的结果。因为处于死锁状态的进程得不到所需的资源,不能向前推进,故得不到结果。
- 死锁会使资源的利用率降低。因为处于死锁状态的进程不释放已占有的资源, 以至于这些资源不能被其他进程利用,故系统资源利用率降低。
- 死锁还会导致产生新的死锁。其它进程因请求不到死锁进程已占用的资源而无法向前推进,所以也会发生死锁。
所以进程出现了死锁,有可能产生多米诺骨牌效应,最终会导致操作系统崩溃!