2013-02-24 16 views
0

如果在多線程應用程序沒有線程在任何時候獲得過任何形式的不止一個鎖,這種鎖總是在某個時候釋放出來,是死鎖可能嗎?必要對死鎖的充分條件發生

我想答案是「否」 - 如果另一個線程想要一個不可用的鎖,它將不會阻止任何其他線程運行的鎖,而只會阻塞,直到它想要的鎖變爲可用 - true ?

如果是這樣的話,在什麼時候做死鎖成爲可能?例如,如果除一個線程之外的所有線程永遠不會獲得多個鎖,那麼是否會造成死鎖?我個人看不出如何。

經典的死鎖案例是一個線程擁有鎖定A的情況,但需要鎖定B,而另一個線程擁有鎖定B並且需要鎖定A.顯然,這對於死鎖是足夠的,但這是最低限度的必要嗎?

+0

你說的意思是「任何一種形式?」您所指的鎖是否有多種類型? – 2013-02-24 21:51:27

+0

可能是 - 互斥量,信號量等 - 線程阻塞控制對共享資源的訪問的同步元素的任何基礎。 – omatai 2013-02-24 21:58:35

回答

0

死鎖可能會發生,如果一個線程鎖,而另一個線程想要獲得相同的鎖定對象的鎖,但第一個線程永遠不會釋放它的鎖(也許是因爲第一個線程在一個條件等必須設置由第二個線程,但第二個線程從不設置該條件,因爲它無法獲得鎖)。

正如你所看到的,故意製造死鎖實際上是一個很容易的事。

+0

但...如果「這種鎖總是在某個時候釋放」,並且不以其他線程設置的數據爲條件,那麼....? – omatai 2013-02-24 22:00:51

+1

然後你不會陷入僵局。當另一個線程正在等待的鎖永遠不會被釋放時,會發生死鎖。當然,棘手的部分是以保證鎖始終釋放的方式編寫程序。 – 2013-02-24 22:13:30

1

從高級概念操作系統的提取物

以下4個條件是必要的死鎖發生

1.Exclusive接入 - 資源

2.Wait而單個接入HOLD - 等待另一個資源時,你已經有一個或多個

3.No搶佔 - 只釋放資源的方式是流程死

4.Circular等待 - 有資源循環依賴需要

的系統很容易出現僵局,如果它滿足所有上述四個條件

你提到的案件是一個請求模型,其中只有一個資源請求,因爲資源在一個時間點被釋放,所以沒有等待和擱置。因此不存在死鎖

然而在情況2對或多個資源的請求,可以有多種方式,這將導致滿足所有上述條件。

你提出的例子是一個典型的循環等待案例。一種解決方案是使用層次結構,即在鎖B之前獲取鎖A ...這將防止循環等待。

我會建議得到更多的想法閱讀和請求模型,或者請求模型,Q REQUEST模型的P輸出,當然還有一個請求MODEL