所謂死鎖是指多個執行緒因競爭資源而造成的一種僵局,多個執行緒被無限的阻塞,執行緒之間相互等待所需的資源,若無外力作用,這些程序都將無法向前推進。
死鎖的產生,通常是下面的兩種情況:
1.如果執行緒試圖對同乙個互斥量加鎖兩次,那麼它自身就會陷入死鎖狀態,使用互斥量時,
2.如果程式使用多個互斥量時,如果允許乙個執行緒一直占有第乙個互斥量,並且在試圖鎖住第二個互斥量時處於阻塞狀態。但是擁有第二個互斥量的執行緒也在試圖鎖住第乙個互斥量,這時就會發生死鎖。因為兩個執行緒都在請求另外乙個執行緒擁有的資源,所以這兩個執行緒無法向前執行,於是產生死鎖。這種情況用一張圖表示,更加形象。如下圖所示,主線程鎖住互斥量l後,加鎖互斥量g;同時工作執行緒鎖住互斥量g而等待互斥量l,則產生經典的死鎖現象。
針對上述型別的死鎖,考慮以下兩種通用的解決方法:
*固定加鎖順序:所有需要同時加鎖互斥量a和互斥量b的**,必須首先加鎖互斥量a,然後加鎖互斥量b
*試加鎖和回退:有時候應用程式的結構使得互斥量加鎖進行排序是很困難的,如果涉及了太多的鎖和資料結構,可用的函式並不能把它轉換成簡單的層次,那麼就需要採用另外的方法。可以先釋放占有的鎖,然後過一段時間再試。這種情況下可以使用pthread_mutex_trylock避免死鎖。如果已經占有某些鎖而且pthread_mutex_trylock介面返回成功,那麼就可以前進;但是,如果不能獲取鎖,可以先釋放已經占有的鎖,做好清理工作,然後過一段時間重新嘗試。
那麼死鎖產生了,如何得知程式的死鎖在哪,該如何除錯呢?
在linux平台下,可以使用 pstack 和 gdb 工具對死鎖程式進行分析。
如沒有core檔案:
1.執行程式,讓程式掛起gdb除錯執行緒死鎖,還有檢測死鎖,可以看看另外兩篇文章。2.查詢程序id ps -e | grep 程式名
4.啟動gdb attach 程序
gdb attach 程序id
5.info threads (顯示所有執行緒資訊
) 6. thread 2 (跳到第2個執行緒
) 7.bt (跳到第2個執行緒
)
使用gdb除錯死鎖執行緒 :
死鎖檢測:
多執行緒死鎖問題
死鎖是一種併發鎖定的特殊狀態,指的是,當具有多個共享資源時 一部分執行緒持有一部分資源的鎖 要求另外的執行緒持有的另外的資源的鎖 形成了各自持有各自的鎖而要求對方的鎖的狀態 這樣 進入了乙個互相等待的狀態 都無法繼續執行 則稱之為產生了死鎖 死鎖並不是一種真正的鎖,而是一種特殊狀態,會造成程式無法繼...
解決執行緒死鎖問題
在編寫多執行緒程式時,必須注意資源的使用問題。如果兩個執行緒 多個執行緒時情況類似 分別擁有不同的資源,而同時又需要對方釋放資源才能繼續執行時,就會發生死鎖。本例項演示了一種解決死鎖的方式,例項執行效果如圖 編寫類deadlock,該類實現了 runnable 介面。在 run 方法中,由於去掉了乙...
多執行緒 死鎖問題
死鎖是指兩個或兩個以上的程序在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。比如現在a有倚天劍,b有屠龍刀,a想要b的屠龍刀,b想要a的倚天劍,但是a不想把倚天劍給b,b同樣也不想把屠龍刀給a。兩個人都等著對方把 交出來.於是就形成了死鎖。pub...