C++(八)— 死鎖原因及解決方法


1、死鎖原因

  死鎖問題被認為是線程/進程間切換消耗系統性能的一種極端情況。在死鎖時,線程/進程間相互等待資源,而又不釋放自身的資源,導致無窮無盡的等待,其結果是任務永遠無法執行完成。

  打個比方,假設有P1和P2兩個進程,都需要A和B兩個資源,現在P1持有A等待B資源,而P2持有B等待A資源,兩個都等待另一個資源而不肯釋放資源,就這樣無限等待中,這就形成死鎖,這也是死鎖的一種情況。給死鎖下個定義,如果一組進程中每一個進程都在等待僅由該組進程中的其他進程才能引發的事件,那么該組進程是死鎖的。

2、產生死鎖必要條件

  當然死鎖的產生是必須要滿足一些特定條件的: 
  1.互斥條件:某資源只能被一個進程使用,其他進程請求該資源時,只能等待,知道資源使用完畢后釋放資源。
  2.請求和保持條件:程序已經保持了至少一個資源,但是又提出了新要求,而這個資源被其他進程占用,自己占用資源卻保持不放。
  3.不剝奪條件:任何一個資源在沒被該進程釋放之前,任何其他進程都無法對他剝奪占用 
  4.循環等待條件:當發生死鎖時,所等待的進程必定會形成一個環路(類似於死循環),造成永久阻塞。

3、處理死鎖思路

  預防死鎖:破壞死鎖的四個必要條件中的一個或多個來預防死鎖。但不能破壞互斥條件,其他三個都可。

  避免死鎖:和預防死鎖的區別就是,在資源動態分配過程中,用某種方式防止系統進入不安全的狀態。

  檢測死鎖:運行時出現死鎖,能及時發現死鎖,把程序解脫出來

  解除死鎖:發生死鎖后,解脫進程,通常撤銷進程,回收資源,再分配給正處於阻塞狀態的進程。

 

參考文獻:https://baijiahao.baidu.com/s?id=1569891442633369&wfr=spider&for=pc

  https://blog.csdn.net/dt_zhangshuo/article/details/53334030


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM