多线程中遇到的常见“死锁”可能有两种情况:1,自身线程等锁(这个应该不叫死锁);2,两个线程相互等对方的锁。
下面就两种情况分别举例:不管哪种情况,出现的时候首先查看函数调用栈,查找函数__lll_lock_wait。
1,本线程内等锁
出现这种情况一般是在一个函数里加锁了,在调用其他的函数里也加锁了,这样就像是嵌套加锁,导致卡死。
通过查看互斥锁变量值中的__owner可以得出,这个互斥锁所属线程为782(哪个线程先获取到锁,锁的拥有者就是该线程),其实就是当前线程。我这个是在项目代码中模拟死锁加的代码。这是已经知道互斥锁变量名称的情况下,打印出锁的信息,如果不知道互斥锁的情况下,该如何打印呢?办法是通过寄存器来看,如:
这个是ARM设备,通过打印r0寄存器查看参数。x86的话是另外一个寄存器,往下看。
2,死锁
这里直接取muduo里代码例子了。
打印thread 1的函数栈调用情况
打印thread 2的函数栈调用情况
造成死锁的原因可以去看原文,截图如下:
所举的例子都是线程少的情况下,如果是更多线程情况下呢,如:
几十个线程都阻塞了,只能是一个一个线程查看了。
关于寄存器的测试得出:
x86机器:
64位:通过rdi寄存器传递第一个参数
32位:通过ebx寄存器传递第一个参数
ARM机器:通过r0传递第一个参数,r1传递第二个参数。
所以在不知道变量名的情况下,可以先切到对应的栈帧,再通过寄存器查看。