天天看点

什么是死锁?为什么会死锁?如何解决死锁问题?如何调试死锁问题?什么是死锁?为什么会死锁?如何解决死锁呢?如何调试死锁?

什么是死锁?

锁,顾名思义,含义真的就是我们平常每天看到的那个锁,锁门的锁,如果门锁着,那就进不去了,那就只能在门外等着。

软件中的锁,意义和这个类似,也是为了阻止非授权用户能够进入某些代码的执行,如果要想执行被锁保护(同步)的代码,那么必须要先获得锁,如果你想进去的时候,别人正在拥有这个锁,你也只好等待了,必须等到被人使用完了以后才能进入被保护或者被同步的代码执行。

什么是死锁呢?

死锁是指两个或两个以上的线程或者进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,而且会一直阻塞下去,此时称软件或者系统处于死锁状态。

为什么会死锁?

我们来看一张图

什么是死锁?为什么会死锁?如何解决死锁问题?如何调试死锁问题?什么是死锁?为什么会死锁?如何解决死锁呢?如何调试死锁?

这里有两个线程,线程A和线程B,这里也有两把锁,锁1和锁2,线程A和线程B分别按照自己的方式来使用这两把锁,线程1先获取锁1,做一些事情,然后获取锁2,再做一些事情,最后释放锁2,释放锁1,线程B先获取锁2,做一些事情,然后获取锁1,再做一些事情,最后释放锁1,释放锁2.

看起来没有问题,而且往往执行起来也没有什么问题,但是,恰恰就是这样的使用锁,就是导致死锁的原因之一。

我们假设线程A获得锁1的同时线程B也获得了锁2,一旦这种情况发生,就发生了死锁,为什么呢?

因为线程A接下来要去获取锁2,因为线程B还没有释放锁2,所以线程A只好等待,同样线程B做了一些事情之后,需要再去获取锁1,同样的原因,线程A还没有释放锁!,因为还在等待锁2呢,所以,线程A和线程B就进入了死锁状态。会一直等待下去,谁也得不到自己想要的锁。

如何解决死锁呢?

要解决死锁问题,必须要正确使用锁,可以从两个方面来解决死锁问题:

1.一个线程使用多个锁的时候,使用顺序保持一致

2.一个线程使用多个锁的时候,锁尽量不要交叉,一个锁用完,立即释放后再去使用另外一个锁。

只要注意了这两点,基本上就不会死锁了,当然如果使用不当,比如循环用锁等,递归使用等,也是有可能发生死锁的。

如何调试死锁?

VC和Windbg都提供了很好的调试死锁的方法,这里有一个视频是关于VC如何调试死锁问题的,如果有兴趣,可以看一下。

https://edu.csdn.net/course/detail/28915

继续阅读