导图社区 多线程死锁调试
多线程死锁调试,查看出现问题的具体行数,分析线程是否结束、未结束猜测死锁
这是一篇关于信息系统项目管理师案例分析万金油的思维导图,大家有兴趣的可以看一下哟。
GDB 没有用于清屏的内置命令,但它可以调用 shell 函数;下面的代码跳到调试器之外以使用cls 命令来清除 xterm 控制台
社区模板帮助中心,点此进入>>
互联网9大思维
安全教育的重要性
组织架构-单商户商城webAPP 思维导图。
个人日常活动安排思维导图
域控上线
西游记主要人物性格分析
17种头脑风暴法
python思维导图
css
CSS
多线程死锁调试
锁的类型(c++为例)
std::mutex
最基本的互斥对象
std::recusive_mutex
可以递归使用(可重入)的互斥对象
推荐使用
std::timed_mutex
带有超时功能,超过时间不会继续等待,返回失败
std::recusive_timed_mutex
超时可重入互斥对象
超时的推荐使用这个
死锁条件
互斥条件
多个线程同时占用某个资源
保持和请求条件
一个线程占用一个资源,没有释放,又去请求其他资源
不可剥夺条件
一个线程占用一个资源后,如果没有主动释放,其他线程无法使使其释放资源
循环等待条件
行程死锁后必然是循环等待
线程1占用mutex1之后,没有释放又去请求mutex2, 线程2占用mutex2之后,没有释放又去请求mutex1, 线程1等待mutex2被释放,线程2等待mutex1被释放,大家都等不到
linux 死锁调试(gdb )
1、Ctrl +C中断程序
2、bt 查看栈回溯
3、 f 帧号:帧切换找到出现问题的函数
4、l :查看出现问题的具体行数,分析线程是否结束、未结束猜测死锁
5、info threads :查看有哪些线程
6、切换到其中之一线程,重复2-5流程分析, 找到出现问题的代码行(是否锁操作)
7、切换到其中之二线程,重复2-5流程分析 找到出现问题的代码行(是否锁操作)
8、分析判断出现问题的代码,判断是否造成死锁
死锁的解决方式
顺序使用锁
线程1、2都是先请求mutex1后再请求mutex2
控制锁的作用域
锁一旦超出作用域就会被释放, 上面的例子不改变顺序的话,直接给锁的位置加花括号{}
使用超时机制
使用RAII机制
RAII:资源获取即初始化