linux下進程鎖重入致使的死鎖

一.問題現象

客戶端收不到服務端的請求,查看服務端再也不響應。現將定位過程記錄以下。linux

二.問題調試過程

使用gdb attach上該服務的進程後,發現有工做線程卡在了鎖的獲取上,如圖windows

clipboard.png
該進程的15號線程,停在了獲取鎖上,切到該線程的第3幀,查看該信號量的信息,如圖spa

clipboard.png

使用命令
ipcs -s -i 35848295
查看佔有該信號量的線程,輸出如圖所示:線程

clipboard.png
能夠看到佔有該信號量的進程是9013進程。調試

接着使用gdb attach上9013號進程。
其中一個線程的調用棧如圖所示code

clipboard.png
看上去,該線程也在獲取鎖,同時仔細觀察了其餘線程鎖,也沒找到有等待鎖的地方。難道是鎖重入了,繼續看上面的棧幀,並對照代碼排查,發現12號幀已經獲取了該鎖。至此問題查明。blog

三.修改和防範措施

windows下進程鎖同一個線程內是能夠重入的,linux下不可重入(能夠寫個簡單的單線程程序驗證)。在linux下,應該避免同一線程進程鎖的重入。
修改方法:減小鎖第一次獲取時的使用範圍,及時釋放。進程

相關文章
相關標籤/搜索