客戶端收不到服務端的請求,查看服務端再也不響應。現將定位過程記錄以下。linux
使用gdb attach上該服務的進程後,發現有工做線程卡在了鎖的獲取上,如圖windows
該進程的15號線程,停在了獲取鎖上,切到該線程的第3幀,查看該信號量的信息,如圖spa
使用命令ipcs -s -i 35848295
查看佔有該信號量的線程,輸出如圖所示:線程
能夠看到佔有該信號量的進程是9013進程。調試
接着使用gdb attach上9013號進程。
其中一個線程的調用棧如圖所示code
看上去,該線程也在獲取鎖,同時仔細觀察了其餘線程鎖,也沒找到有等待鎖的地方。難道是鎖重入了,繼續看上面的棧幀,並對照代碼排查,發現12號幀已經獲取了該鎖。至此問題查明。blog
windows下進程鎖同一個線程內是能夠重入的,linux下不可重入(能夠寫個簡單的單線程程序驗證)。在linux下,應該避免同一線程進程鎖的重入。
修改方法:減小鎖第一次獲取時的使用範圍,及時釋放。進程