造成死鎖的兩種情況
1、對共享資源鎖了2次。
while(1)
如上,鎖了兩次,此時現象是 輸出了一遍hello,便不動了
分析:輸出hello後, pthread_mutex_lock(&mutex);又要加鎖,加鎖的話,就要先等上一把鎖解鎖,否則就處於阻塞狀態,而上一把鎖就是他本身,他本身又沒有解鎖,所以就一直處於阻塞狀態了。
所以,為避免這種情況,需要加鎖後,訪問完資料,立馬解鎖。
2、執行緒1擁有a鎖,請求獲得b鎖,執行緒2擁有b鎖,請求獲得a鎖。
分析:執行緒1擁有a鎖,請求b鎖,但是,b鎖被執行緒2占用,所以,執行緒1阻塞;
同樣,執行緒2擁有b鎖,請求a鎖,但是,a鎖被執行緒1占用,所以,執行緒2阻塞;這樣就造成了死鎖。
解決方法1:首先使用trylock,避免阻塞;當不能取得所有鎖的時候,放棄已經占有的鎖,假設執行緒1,lock了a鎖,然後trylockb鎖,發現b鎖被被占用,則執行緒1放棄a鎖,那麼,執行緒2在獲得了b鎖後,接著又可以獲得a鎖了,獲取共享資源後,執行緒2釋放a鎖和b鎖,執行緒1就可以獲取a鎖和b鎖了。
解決方法2:多個執行緒獲取鎖的順序保持一致,即都獲取a鎖,再獲取b鎖。
執行緒同步之死鎖
public class stateobject i public void deadlock2 i stateobject state1 new stateobject stateobject state2 new stateobject new thread new samplethread s...
執行緒同步之死鎖
什麼是死鎖呢?死鎖就是多個程序或者執行緒訪問同乙個資源的時候,誰也搶不到資源,誰也不退讓讓其他程序或者執行緒訪問,使用者看到的就是程式卡住了。舉個例子吧,在乙個沒有紅綠燈的十字路口,來了四輛小汽車,每個路口都只能讓乙個汽車通過。現在這種情況四輛車都過不了汽車,這就發生了死鎖。發生死鎖的原因?第一種情...
多執行緒之死鎖
1 死鎖發生的場景 有時候兩個或者多個執行緒需要訪問同乙份資源,這裡就涉及到執行緒同步的問題 thread1 synchronized object1 thread2 synchronized object2 看看上面的例子,兩個執行緒各自都有想要訪問對方的想法,可是雙方都不願意放手,就像a拿到了開...