记一次项目的死锁分析

1.场景

公司项目使用多线程开发,因此使用gdb exec -c corefile运行core文件后,使用bt打印堆栈信息 看不出问题,需要进入到线程内部分析。

2.分析

    1. info threads 打印线程信息

    

可以看到有多个__lll_lock_wait () , 看到这里,我们推测可能是锁出现问题了。那么继续往,进入到线程内部,随便找一个是__lll_lock_wait ()状态的,使用thread(缩写 t)t 639 ,在使用bt查看堆栈

使用frame(错写 f) f 3进入到函数内部,打印函数内部的变量查看是哪个锁被哪个线程锁住了

可以看到 gUserStateInfoLock 被线程 19204 锁住了。在info thread 打印的线程信息可以看到19204 对应的线程号是566,进入到 566 线程内部 t 566,该线程占用了 gUserStateInfoLock

在findCorpInfoNodeByPhoneNu 内部,请求使用g_XmlCorpInfoListLock 锁,该锁被 t 14 占用

t 14 线程占用了g_XmlCorpInfoListLock ,同时又在等待 gUserStateInfoLock,

而gUserStateInfoLock 被19024 这个程序,因此可以断定是发生死锁了。

3 解决

使用了四种解决死锁方式里其中的一种,就是保持枷锁顺序的一致性。线程1使用锁1,和锁2的顺序,那么线程2也应该使用锁1和锁2 的顺序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值