记一次项目的死锁分析

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 的顺序