執行緒原理篇 第9章 死鎖應對之哲學原理

2022-09-16 07:48:08 字數 1355 閱讀 2869

死鎖的發生,歸根結底是因為對資源的競爭。

死鎖的定義:如果有一組執行緒,每個執行緒都在等待乙個事件的發生,而這個事件只能由該組執行緒裡面的另一線程發生,則我們稱這組執行緒發生了死鎖。這裡的事件通常是資源的釋放。

如果a和b交替執行,a首先執行,獲得鎖x,然後b執行,獲得鎖y;但在b試圖獲得鎖x的時候將被拒絕(因為a持有x鎖),因此將等待鎖x;這個時候執行緒a再執行,檢視獲得鎖y,因為y被b持有,a將等待y。至此,a和b皆不能夠執行,也皆不能釋放鎖(因為已經等待另一把鎖),從而贊成死鎖。

當然,並不一定會發生死鎖。如果a先執行,獲得x和y兩把鎖之後b再執行,則將不會 發生死鎖。事實上,這種情況發生死鎖的可能性遠低於不發生死鎖的可能。

互斥條件;請求和保持條件;不剝奪條件;環路等待條件

條件1:資源有限。即乙個系統裡面的資源數量有限,以致無法同時滿足所有執行緒的資源需求。

條件2:持有等待。即乙個執行緒在請求新的資源時,其已經獲得的資源並不釋放,而是繼續持有。

條件3:不能搶占。如果可以搶占乙個資源,也不會發生死鎖。

第1種方式(解除死鎖):假裝沒有看見,不予理睬,也就是任由死鎖發生;windows、linux等商業作業系統通常採用這種方式。

第2種方式(檢測死鎖):在死鎖發生後,想辦法予以解決。高可靠性系統、實時系統採用這種方式。

第3種方式(避免死鎖):在資源的動態分配過程中,用某種方法去防止系統進入不安全狀態,從而避免死鎖的發生。缺點:實現困難,設計實現和時間成本上都不理想。

第4種方式(預防死鎖):通過將發生死鎖的必要條件消除,杜絕死鎖的發生,死鎖的靜態防止。

第1種方式:消除資源獨佔條件。通過資源共享來實現。

第2種方式:消除保持和請求條件。

方法一:乙個執行緒必須一次請求其所需要的所有資源,而不是一般情況下的請求一點資源,做一點事情;到需要下乙個資源的時候再請求,獲得資源後再繼續推進。由於乙個執行緒一次就獲得了其所需要的所有資源,該執行緒自然就可以順利執行,從而不會發生死鎖。這種辦法的缺點的乙個問題是一次將所有資源拿齊,太過浪費;另乙個問題是乙個執行緒一開始就需要知道所需要的所有資源,這是很困難的。

方法二:在需要資源的時候才請求,但加上乙個條件:如果請求的資源被拒絕,則該執行緒需將其現在已經擁有的資源也釋放掉。缺點:在獲得某個資源失敗後,需要釋放已經占用的所有資源,而這可能造成問題。例如,如果乙個執行緒已經獲得一些鎖,但在鎖裡的工作又沒有做完。如果這時釋放鎖,很可能造成前功盡棄,從而造成浪費。

第3種方式:允許搶占資源,也就是說可以從乙個執行緒手中將資源搶奪過來。侷限性:不是所有的資源都可以被搶占而不產生不良後果。例如,鎖。

第4種方式:消除迴圈等待條件,即順序請求資源。典型例子:鎖的使用。

執行緒原理篇 第7章 執行緒

程序與執行緒的區別 面試題 執行緒就是我們為了讓乙個程序能夠同時幹多件事情而發明的 分身術 執行緒的本質 擁有同樣的程式文字。執行緒是程序裡面的乙個執行上下文或者執行序列。乙個程序可以擁有多個執行序列。將程序分解為執行緒還可以有效利用多處理器和多核計算機。在沒有執行緒的情況下,增加乙個處理器並不能讓...

倒車雷達原理篇

往後倒一點,再往後,打方向盤,打多了,回一點再倒,好,停!相信一般的車主在停車場泊位時,都會遇到車輛保管員的 熱情招呼 車技純熟的倒 也與人工提示配合默契 車技一般 方向感較差的,就經常使負責指揮的那位人士高度緊張,脾氣急躁的還少不了擠兌車主幾句。可是,並不是所有車主都有幸得到 人工倒車指引,比如說...

iOS知識原理篇

weak策略表明該屬性定義了一種 非擁有關係 nonowning relationship 為這種屬性設定新值時,設定方法既不保留新值,也不釋放舊值。此特質同assign類似 然而在屬性所指的物件遭到摧毀時,屬性值也會清空 nil out runtime對註冊的類,會進行布局,會將 weak 物件放...