死鎖:一種情形,此時執行程序中兩個或多個線程發生永久堵塞(等待),每一個線程都在等待被 算法
其餘線程佔用並堵塞了的資源。例如,若是線程A鎖住了記錄1並等待記錄2,而線程B鎖住了記錄2並等待記錄1,這樣兩個線程就發生了死鎖現象。app
gdb調試死鎖的方法:spa
gdb 線程
attach pid調試
thread apply all bt資源
找到_lll_lock_wait 鎖等待的地方。it
而後查找該鎖被哪一個線程鎖住了。thread
例如:程序
查看哪一個線程擁有互斥體方法
(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)加鎖(擁有)的。
找出死鎖的地方,對應檢查代碼就能夠了。死鎖大可能是對鎖的使用發生交叉所致的,解決死鎖的方法常有: