前言
在找工作中,面试问到了这个,啥也不会,现在记录一下
一 死锁原因
多线程死锁的原因是多个线程同时被阻塞,它们中的一个或全部都在等待某个资源被释放,而该资源又被其他线程锁定。
产生死锁的四个必要条件:
- 互斥
- 不可抢占
- 请求保持
- 循环等待
死锁原因:
- 资源不够
- 进程推进顺序不合适
避免死锁方法:
- 加锁顺序
- 加锁实现
- 死锁检测
二 用GDB调试死锁线程
2.1 详细过程
https://blog.csdn.net/atinybirdinit/article/details/41550149
/*
死锁调试
1) -g参数
2) attach
3) info threads
4) thread + number切换到对应的线程或thread apply all bt全部设置断点
*/
2.2 笔记记录
<1> 查找进程id,即PID
ps -e | grep a.out
<2> 启动 gdb attach 进程
gdb a.out 12826 // 12826是PID
info threads //显示所有线程信息
thread 2 // 选择进入第二个线程
bt //查看线程2的堆栈,可以发现该线程堵塞在lock.c第17行