死锁产生
程序的多个线程获取多个锁资源时,有可能发生死锁,比如线程A获取了锁1,线程B获取了锁2,线程A还需要获取锁2,线程B还需要获取锁1,这时双方都在等待对方的锁资源,线程A和线程B互相等待,进程死锁。
即多线程获取锁的顺序不一致
1 |
|
终端执行:
1 | g++ thread.cpp -g -lpthread |
运行结果:
1 | 线程A获取锁1 |
死锁定位分析
ps命令查看状态和进程号PID
1 | ubuntu@ubuntu-ThinkCentre-M800t-1N000:~$ ps -aux | grep a.out |
可以看出a.out进程PID是390341,进程状态 Sl+代码说明多线程程序进入阻塞状态
使用 gdb attach pid 调试a.out进程
1 | ubuntu@ubuntu-ThinkCentre-M800t-1N000:~$ sudo gdb attach 390341 |
使用 info threads 查看线程信息
1 | (gdb) info threads |
使用 thread 2 查看线程2信息
1 | (gdb) thread 2 |
使用 where 查看堆栈
1 | #0 __lll_lock_wait (futex=futex@entry=0x55c69ef241a0 <mtx2>, private=0) at lowlevellock.c:52 |
可以看到 #5 0x000055c69ef1f3f8 in TaskA () at thread.cpp:17
使用 thread 2 查看线程2信息,并使用 where 查看堆栈
1 | (gdb) thread 3 |
看到 #5 0x000055c69ef1f541 in TaskB () at thread.cpp:31
使用 bt 查看堆栈
1 | (gdb) bt |