死锁的概念
2023-12-18 19:08:05

1.死锁的概念

在多线程编程中,我们为了防止多线程竞争共享资源而导致数据错乱,都会在操作共享资源之前加上互斥锁,只有成功获得互斥锁的线程,才能操作共享资源,获取不到锁的线程只能等待,直到锁被释放

那么,当两个线程为了保护两个不同的共享资源而使用了两个互斥锁,那么这两个互斥锁应用不当的时候,可能会造成两个线程都在等待对方释放锁,在没有外力的作用下,这些线程会一直等待,就没办法继续运行,这种情况发生了死锁

死锁只有同时满足以下四个条件才会发生:

  • 互斥条件
  • 持有并等待条件
  • 不可剥夺条件
  • 环路等待条件

1.1.互斥条件

互斥条件是指:多个线程不能同时使用一个资源

image-20231218110300371

1.2.持有并等待条件

持有并等待条件是指:当线程A已经持有资源1,又想申请资源2,而资源2已经被线程C持有,则线程A只能等待

但是线程A在等待资源2的同时并不会释放自己已经持有的资源1

image-20231218110729823

1.3.不可剥夺条件

不可剥夺条件是指:当前线程已经持有了该资源,在自己使用完成之前不能被其他线程获取,线程B如果也想使资源,则只能在线程A使用完并释放才能获取
image-20231218111045977

1.4.环路等待条件

环路等待条件是指:在死锁发生的时候,两个线程获取资源的顺序构成了环形链

比如:线程A已经持有资源2,而想要请求资源1,线程B已经获取了资源1,而想要请求资源2,这就形成资源请求等待的环形图

image-20231218111301725

2.如何避免死锁

避免死锁问题就只需要破坏其中一个条件就可以,最常见并且可行的就是使用资源有序分配法,来破坏环路等待条件

资源有序分配法:线程A和线程B获取的资源的顺序要一样,当线程A是先尝试获取资源A,然后尝试获取资源B,线程B同样也是尝试获取资源A,然后尝试资源B,也就是说,线程A和线程B总是以相同的顺序申请自己想要的资源

image-20231218113122392