出現死鎖需要同時滿足四個條件,有乙個不具備,系統就不會出現死鎖。
互斥條件。即某個資源在一段時間內只能由乙個程序占有,不能同時被兩個或兩個以上的程序占有。這種獨佔資源如cd-rom驅動器,印表機等等,必須在占有該資源的程序主動釋放它之後,其它程序才能占有該資源。這是由資源本身的屬性所決定的。如獨木橋就是一種獨佔資源,兩方的人不能同時過橋。
不可搶占條件。程序所獲得的資源在未使用完畢之前,資源申請者不能強行地從資源佔有者手中奪取資源,而只能由該資源的佔有者程序自行釋放。如過獨木橋的人不能強迫對方後退,也不能非法地將對方推下橋,必須是橋上的人自己過橋後空出橋面(即主動釋放占有資源),對方的人才能過橋。
占有且申請條件。程序至少已經占有乙個資源,但又申請新的資源;由於該資源已被另外程序占有,此時該程序阻塞;但是,它在等待新資源之時,仍繼續占用已占有的資源。還以過獨木橋為例,甲乙兩人在橋上相遇。甲走過一段橋面(即占有了一些資源),還需要走其餘的橋面(申請新的資源),但那部分橋面被乙占有(乙走過一段橋面)。甲過不去,前進不能,又不後退;乙也處於同樣的狀況。
迴圈等待條件。存在乙個程序等待序列,其中p1等待p2所占有的某一資源,p2等待p3所占有的某一源,……,而pn等待p1所占有的的某一資源,形成乙個程序迴圈等待環。就像前面的過獨木橋問題,甲等待乙占有的橋面,而乙又等待甲占有的橋面,從而彼此迴圈等待。
本例只簡單實現死鎖的現象,定義兩個訊號量a、b,乙個互斥鎖用於保護臨界資源同一時間只能有乙個任務執行並且不釋放已擁有的資源。主線程進行v操作,子執行緒進行p操作。
**如下:
#include
#include
#include
#include
pthread_mutex_t mlock = pthread_mutex_initializer;
sem_t a,b;
void
*thr_fn1
(void
*arg)
}void
*thr_fn2
(void
*arg)
}int
main
(void)if
(sem_init
(&b,0,
1)<0)
pthread_create
(&tid[0]
,null
, thr_fn1,
null);
pthread_create
(&tid[1]
,null
, thr_fn2,
null);
while(1
)for
(i =
0; i <
2; i++
)pthread_join
(tid[i]
,null);
return0;
}
結果驗證:
無任何列印語句,死鎖狀態。
若將兩個子執行緒其中乙個注釋,則可以看見列印語句,正常態
多執行緒之死鎖
1 死鎖發生的場景 有時候兩個或者多個執行緒需要訪問同乙份資源,這裡就涉及到執行緒同步的問題 thread1 synchronized object1 thread2 synchronized object2 看看上面的例子,兩個執行緒各自都有想要訪問對方的想法,可是雙方都不願意放手,就像a拿到了開...
多執行緒之死鎖
死鎖。同步中巢狀同步。你有一根筷子,我有一根筷子,我要吃飯,你不給我,我不給你,誰都吃不著飯,死鎖發生,但是死鎖不一會發生,也會存在和諧的狀態,就是你把筷子給我,我吃一口,我再把筷子給你,你再吃一口 class ticket implements runnable else while true s...
java多執行緒之 死鎖
當兩個或多個執行緒競爭試圖獲取對方持有的同步鎖時,它們都會處於阻塞狀態,除非某個執行緒主動釋放自己所持有的同步鎖,這時,死鎖就出現了。用下面這張圖很好理解 如圖,執行緒thread1和thread2都有兩個同步方法operation1 operation2 operation1 中會呼叫operat...