使用多线程的时候,一种非常简单的避免死锁的方式:指定获取锁的顺序,并强制现场按照指定的顺序获取锁。因此,所有线程按照同样的顺序加锁和释放就不会出现死锁。
请问什么是死锁(deadlock)?
竞争不可抢占资源形成死锁
如果有两个线程T1和T2,要打开两个文件F1和F2,如果等线程T1打开F1和F2并释放后T2打开F1和F2不会出现任何问题。但是如果T1打开了F1此时需要去申请打开F2,此时T2打开了F2要去申请F1这样两个线程就阻塞了他们希望对方关闭自己所需的文件,但谁也无法运行,只能无限等待。
竞争可消耗资源形成死锁
以生产者消费者为举例,有一个公共的空间S一个生产者线程PT一个消费者线程CT,如果CT线程先运行,并没有对有没有产品判断不断地像公共空间S申请自己所需要的资源,那么生产者线程就永远无法运行产生死锁
具体来说:如果消费者线程持有公共空间的锁,并且不释放锁的话,生产者线程就无法获取到锁,从而无法将产品放入公共空间。而如果生产者线程在等待公共空间的锁时,消费者线程也在等待公共空间的锁,那么就会出现死锁的情况。
产生死锁的四个条件
互斥条件
一个资源每次只能被一个进程使用,互斥条件是非共享设备所必须的,不仅不能改变还需要加以保证。
请求和保持
一个进程因请求资源而阻塞且对已获得的资源保持不放
不可剥夺(不可抢占
线程已获得的资源在在未使用完之前,不能强行剥夺
循环等待
若干个线程之间形成一种头尾相接的循环等待资源关系
破坏死锁的四个条件
互斥条件
由于资源互斥是资源使用的固有特性,无法改变
请求和保持
一次性获取所有需要的资源,或者在进程开始执行之前,就为进程分配好所有需要的资源
不可剥夺(不可抢占
可以强制剥夺进程已经获得的资源
循环等待
对资源进行排序,规定每个进程按照固定的顺序请求资源