1. 程式人生 > >gdb 檢視死鎖

gdb 檢視死鎖

死鎖:一種情形,此時執行程式中兩個或多個執行緒發生永久堵塞(等待),每個執行緒都在等待被   其他執行緒佔用並堵塞了的資源。例如,如果執行緒A鎖住了記錄1並等待記錄2,而執行緒B鎖住了記錄2並等待記錄1,這樣兩個執行緒就發生了死鎖現象。 gdb除錯死鎖的方法: gdb  attach pid thread apply all bt 找到_lll_lock_wait 鎖等待的地方。 然後查詢該鎖被哪個執行緒鎖住了。 例如: 檢視哪個執行緒擁有互斥體 (gdb) print AccountA_mutex $1 = {__m_reserved = 2, __m_count = 0, __m_owner = 0x2527, __m_kind = 0, __m_lock = {__status = 1, __spinlock = 0}} (gdb) print 0x2527 $2 = 9511 (gdb) print AccountB_mutex $3 = {__m_reserved = 2, __m_count = 0, __m_owner = 0x2529, __m_kind = 0, __m_lock = {__status = 1, __spinlock = 0}} (gdb) print 0x2529 $4 = 9513 (gdb) 從上面的命令中,我們可以看出AccontA_mutex是被執行緒 5(LWP 9511)加鎖(擁有)的,而AccontB_mutex是被執行緒 3(LWP 9513)加鎖(擁有)的。 找出死鎖的地方,對應檢查程式碼就可以了。死鎖大多是對鎖的使用發生交叉所致的,解決死鎖的方法常有:

有序資源分配法

銀行演算法