1樓:縱橫豎屏
1、避免給一個鎖巢狀上鎖,在持有一個鎖的時候,不要再給這個鎖上鎖。如果使用多個鎖,使用std::lock。
2、在持有鎖時,不要呼叫別人提供的函式,因為你不清楚別人的**怎麼實現的,不知道它是不是在使用鎖。
3、給多個鎖上鎖時,固定順序。如果在給多個所上鎖,並且無法使用std::lock,最好的做法就是在每一個執行緒中,都按照同樣的順序。
4、分層次來使用鎖,把程式分成幾個層次。區分每個層次中使用的鎖,當一個執行緒已經持有更低層次的鎖時,不允許使用高層次的鎖。可以在程式執行時給不同的鎖加上層次號,記錄每個執行緒持有的鎖。
2樓:匿名使用者
避免死鎖的方法一般有:
有序的資源分配法,
銀行家演算法。
死鎖: 是指兩個或兩個以上的程序在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。
產生死鎖的原因主要是:
(1) 因為系統資源不足。
(2) 程序執行推進的順序不合適。
(3) 資源分配不當等。
產生死鎖的四個必要條件:
(1)互斥條件:一個資源每次只能被一個程序使用。
(2)請求與保持條件:一個程序因請求資源而阻塞時,對已獲得的資源保持不放。
(3)不剝奪條件:程序已獲得的資源,在末使用完之前,不能強行剝奪。
(4)迴圈等待條件:若干程序之間形成一種頭尾相接的迴圈等待資源關係。
所以要根據產生死鎖的條件進行預防,並且要儘量避免死鎖。所以解決策略有:
(1)破壞互斥條件:
就是在系統裡取消互斥。若資源不被一個程序獨佔使用,那麼死鎖是肯定不會發生的。
但一般來說在所列的四個條件中,「互斥」條件是無法破壞的。因此,在死鎖預防裡主要是破壞其他幾個必要條件,而不去涉及破壞「互斥」條件
(2)破壞「佔有並等待」條件:
破壞「佔有並等待」條件,就是在系統中不允許程序在已獲得某種資源的情況下,申請其他資源。即要想出一個辦法,阻止程序在持有資源的同時申請其他資源。
方法一:建立程序時,要求它申請所需的全部資源,系統或滿足其所有要求,或麼什麼也不給它。這是所謂的 「 一次性分配」方案。
方法二:要求每個程序提出新的資源申請前,釋放它所佔有的資源。這樣,一個程序在需要資源s時,須先把它先前佔有的資源r釋放掉,然後才能提出對s的申請,即使它可能很快又要用到資源r。
(3)破壞「不可搶佔」條件
破壞「不可搶佔」條件就是允許對資源實行搶奪。
方法一:如果佔有某些資源的一個程序進行進一步資源請求被拒絕,則該程序必須釋放它最初佔有的資源,如果有必要,可再次請求這些資源和另外的資源。
方法二:如果一個程序請求當前被另一個程序佔有的一個資源,則作業系統可以搶佔另一個程序,要求它釋放資源。只有在任意兩個程序的優先順序都不相同的條件下,方法二才能預防死鎖。
(4)破壞「迴圈等待」條件
破壞「迴圈等待」條件的一種方法,是將系統中的所有資源統一編號,程序可在任何時刻提出資源申請,但所有申請必須按照資源的編號順序(升序)提出。這樣做就能保證系統不出現死鎖。
避免死鎖:
死鎖的預防是通過破壞產生條件來阻止死鎖的產生,但這種方法破壞了系統的並行性和併發性。
死鎖產生的前三個條件是死鎖產生的必要條件,也就是說要產生死鎖必須具備的條件,而不是存在這3個條件就一定產生死鎖,那麼只要在邏輯上回避了第四個條件就可以避免死鎖。
避免死鎖採用的是允許前三個條件存在,但通過合理的資源分配演算法來確保永遠不會形成環形等待的封閉程序鏈,從而避免死鎖。該方法支援多個程序的並行執行,為了避免死鎖,系統動態的確定是否分配一個資源給請求的程序。
總的思路來說,預防死鎖就是避免死鎖的最好方法!不過一旦預防不了而產生死鎖就應該及時中斷程序和破壞中斷。最有效的兩個做法就是一,只執行需要的程序程式而禁用其他程序程式,二,重啟機器來破壞中斷是最直接有效的。
3樓:木木有心
有一種最簡單的就是:全部程式禁用,然後重啟自己需要的程式。
什麼是死鎖?解決死鎖有那幾種策略?這些策略分別有哪些實現方法?
4樓:匿名使用者
在併發程式設計中,死鎖 (deadlock) 是一種十分常見的邏輯錯誤。通過採用正確的程式設計方式,死鎖的發生不難避免。
死鎖的四個必要條件
在計算機專業的本科教材中,通常都會介紹死鎖的四個必要條件。這四個條件缺一不可,或者說只要破壞了其中任何一個條件,死鎖就不可能發生。我們來複習一下,這四個條件是:
•互斥(mutual exclusion):存在這樣一種資源,它在某個時刻只能被分配給一個執行緒(也稱為執行緒)使用;
•持有(hold and wait):當請求的資源已被佔用從而導致執行緒阻塞時,資源佔用者不但無需釋放該資源,而且還可以繼續請求更多資源;
•不可剝奪(no preemption):執行緒獲得到的互斥資源不可被強行剝奪,換句話說,只有資源佔用者自己才能釋放資源;
•環形等待(circular wait):若干執行緒以不同的次序獲取互斥資源,從而形成環形等待的局面,想象在由多個執行緒組成的環形鏈中,每個執行緒都在等待下一個執行緒釋放它持有的資源。
解除死鎖的必要條件
不難看出,在死鎖的四個必要條件中,第
二、三和四項條件比較容易消除。通過引入事務機制,往往可以消除第
二、三兩項條件,方法是將所有上鎖操作均作為事務對待,一旦開始上鎖,即確保全部操作均可回退,同時通過鎖管理器檢測死鎖,並剝奪資源(回退事務)。這種做法有時會造成較大開銷,而且也需要對上鎖模式進行較多改動。
消除第四項條件是比較容易且代價較低的辦法。具體來說這種方法約定:上鎖的順序必須一致。
具體來說,我們人為地給鎖指定一種類似「水位」的方向性屬性。無論已持有任何鎖,該執行緒所有的上鎖操作,必須按照一致的先後順序從低到高(或從高到低)進行,且在一個系統中,只允許使用一種先後次序。
請注意,放鎖的順序並不會導致死鎖。也就是說,儘管按照 鎖a, 鎖b, 放a, 放b 這樣的順序來進行鎖操作看上去有些怪異,但是隻要大家都按先a後b的順序上鎖,便不會導致死鎖。
舉例假如有三個物件a、b、c,我們人為約定它們的鎖序是: a 先於 b 先於 c。舉例說來,下列鎖序均為合法:
• 鎖c,放c
• 鎖b,放b
• 鎖b,鎖c,放b,放c
• 鎖b,鎖c,放c,放b
• 鎖a,放a
• 鎖a,鎖c,放a,放c
• 鎖a,鎖c,放c,放a
• 鎖a,鎖b,放a,放b
• 鎖a,鎖b,放b,放a
• 鎖a,鎖b,鎖c,放a,放b,放c
• 鎖a,鎖b,鎖c,放c,放b,放a
而在上面定義的系統中,可能導致發生死鎖典型上鎖序列包括:
• 鎖b,鎖a,鎖c,放c,放a,放b
(因為先b後a的上鎖順序違反了鎖序約定,如果另一執行緒同時按照先a後b的順序上鎖,則可能由於執行緒甲獲得了b,執行緒乙獲得了a,而導致雙方同時等待對方釋放所持有的鎖,從而形成死鎖局面;解法是將操作序列中增加適當的鎖操作,即改為鎖b,放b,鎖a,鎖b,鎖c,放c,放a,放b)
或者說,只要拿鎖的時候不出現逆序(例如拿著c的時候試圖抓b或a,或者拿著b的時候試圖抓a),並出現潛在逆序的時候先放掉「小」鎖再抓大的,就一定不造成死鎖了。
什麼是死鎖?解決死鎖有那幾種策略?這些策略分別有哪些實現方法?
5樓:實桂花盧璧
什麼是死鎖?如果一個程序集合裡面的每個程序都在等待只能由這個集合中的其他一個程序(包括他自身)才能引發的事件,這種情況就是死鎖。這個定義可能有點拗口,一個最簡單的例子就是有資源a和資源b,都是不可剝奪資源,現在程序c已經申請了資源a,程序d也申請了資源b,程序c接下來的操作需要用到資源b,而程序d恰好也在申請資源a,那麼就引發了死鎖。
這個肯定每個人都看過了。然後套用回去定義:如果一個程序集合裡面(程序c和程序d)的每個程序(程序c和程序d)都在等待只能由這個集合中的其他一個程序(對於程序c,他在等程序d;對於程序d,他在等程序c)才能引發的事件(釋放相應資源)。
這裡的資源包括了軟的資源(**塊)和硬的資源(例如掃描器)。資源一般可以分兩種:可剝奪資源(preemptable)和不可剝奪資源(nonpreemptable)。
一般來說對於由可剝奪資源引起的死鎖可以由系統的重新分配資源來解決,所以一般來說大家說的死鎖都是由於不可剝奪資源所引起的。死鎖的四個必要條件互斥條件(mutual
exclusion):資源不能被共享,只能由一個程序使用。
請求與保持條件(hold
andwait):已經得到資源的程序可以再次申請新的資源。
非剝奪條件(no
pre-emption):已經分配的資源不能從相應的程序中被強制地剝奪。
2.檢測死鎖並且恢復。
3.仔細地對資源進行動態分配,以避免死鎖。
4.通過破除死鎖四個必要條件之一,來防止死鎖產生。
請舉一個例子說明什麼是死鎖,怎樣避免死鎖
6樓:匿名使用者
所謂死鎖:是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。
由於資源佔用是互斥的,當某個程序提出申請資源後,使得有關程序在無外力協助下,永遠分配不到必需的資源而無法繼續執行,這就產生了一種特殊現象死鎖。
雖然程序在執行過程中,可能發生死鎖,但死鎖的發生也必須具備一定的條件,死鎖的發生必須具備以下四個必要條件。
1)互斥條件:指程序對所分配到的資源進行排它性使用,即在一段時間內某資源只由一個程序佔用。如果此時還有其它程序請求資源,則請求者只能等待,直至佔有資源的程序用畢釋放。
2)請求和保持條件:指程序已經保持至少一個資源,但又提出了新的資源請求,而該資源已被其它程序佔有,此時請求程序阻塞,但又對自己已獲得的其它資源保持不放。
3)不剝奪條件:指程序已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時由自己釋放。
4)環路等待條件:指在發生死鎖時,必然存在一個程序——資源的環形鏈,即程序集合中的p0正在等待一個p1佔用的資源;p1正在等待p2佔用的資源,……,pn正在等待已被p0佔用的資源。
在系統中已經出現死鎖後,應該及時檢測到死鎖的發生,並採取適當的措施來解除死鎖。目前處理死鎖的方法可歸結為以下四種:
1) 預防死鎖。
這是一種較簡單和直觀的事先預防的方法。方法是通過設定某些限制條件,去破壞產生死鎖的四個必要條件中的一個或者幾個,來預防發生死鎖。預防死鎖是一種較易實現的方法,已被廣泛使用。
但是由於所施加的限制條件往往太嚴格,可能會導致系統資源利用率和系統吞吐量降低。
2) 避免死鎖。
該方法同樣是屬於事先預防的策略,但它並不須事先採取各種限制措施去破壞產生死鎖的的四個必要條件,而是在資源的動態分配過程中,用某種方法去防止系統進入不安全狀態,從而避免發生死鎖。
3)檢測死鎖。
這種方法並不須事先採取任何限制性措施,也不必檢查系統是否已經進入不安全區,此方法允許系統在執行過程中發生死鎖。但可通過系統所設定的檢測機構,及時地檢測出死鎖的發生,並精確地確定與死鎖有關的程序和資源,然後採取適當措施,從系統中將已發生的死鎖清除掉。
4)解除死鎖。
這是與檢測死鎖相配套的一種措施。當檢測到系統中已發生死鎖時,須將程序從死鎖狀態中解脫出來。常用的實施方法是撤銷或掛起一些程序,以便**一些資源,再將這些資源分配給已處於阻塞狀態的程序,使之轉為就緒狀態,以繼續執行。
死鎖的檢測和解除措施,有可能使系統獲得較好的資源利用率和吞吐量,但在實現上難度也最大。
緩解或避免失眠的方法有哪些
有哪些解決失眠的小竅門?方法二 為了防止出現失眠,可以在睡前做以下動作 把手疊放在小腹上,然後採用腹式呼吸,把全部的注意力轉移到小腹,然後心裡默唸數數,這樣的話就能很快入睡的。這也是預防失眠的方法之一,而且還能達到瘦腹部的目的。方法三 要想改善睡眠質量,還可以在睡前用熱水泡腳,一般用微燙的水,一直到...
寶寶為什麼會出現脹氣?有哪些避免方法家長一定要知道
寶寶之所以會出現脹氣也是因為寶寶的喉部肌肉和吞嚥能力沒那麼好,但這種情況一般是在寶寶三個月之前才會出現的。寶寶在三個月之後喉部肌肉發育的好了,就不會出現寶寶脹氣的情況了,所以在寶寶前三個月的時候一定要好好護理。其實,對於小月齡的寶寶來說,胃腸脹氣很常見,但大多是因為餵養或者護理不當導致的,因而想要預...
甲醛的危害有哪些?如何避免呢
可怕的甲醛房不僅會降低室內空氣質量,對人體的危害也不容小覷,當刷到網際網路因白血病等新聞甲醛和痛苦,我相信我們不禁倒吸一口冷氣,但人們不知道的訊息出現,但甲醛是每個人都暴露在有害氣體,特別是繼續買房或修繕的人的房子,越來越多的這樣的訊息會害怕避免一切生活甲醛在室內,去除甲醛要從自己的這個關鍵點開始。...