記一次項目的死鎖分析

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

發佈了35 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章