C#中lock死鎖


在c#中有個關鍵字lock,它的作用是鎖定某一代碼塊,讓同一時間只有一個線程訪問該代碼塊,本文就來談談lock關鍵字的原理和其中應注意的幾個問題:

lock的使用原型是:

lock(X)
{
  //需要鎖定的代碼.... 
}

首先要明白為什么上面這段話能夠鎖定代碼,其中的奧妙就是X這個對象,事實上X是任意一種引用類型,它在這兒起的作用就是任何線程執行到lock(X)時候,X需要獨享才能運行下面的代碼,若假定現在有3個線程A,B,C都執行到了lock(X)而ABC因為此時都占有X,這時ABC就要停下來排個隊,一個一個使用X,從而起到在下面的代碼塊內只有一個線程在運行(因為此時只有一個線程獨享X,其余兩個在排隊),所以這個X必須是所有要執行臨界區域代碼進程必須共有的一個資源,從而起到抑制線程的作用。

什么是死鎖?

線程死鎖是指由於兩個或者多個線程互相持有對方所需要的資源會互相等待對方釋放資源,導致這些線程處於等待狀態,無法前往執行。如果線程都不主動釋放所占有的資源,將產生死鎖。

當然死鎖的產生是必須要滿足一些特定條件的:
1.互斥條件:進程對於所分配到的資源具有排它性,即一個資源只能被一個進程占用,直到被該進程釋放
2.請求和保持條件:一個進程因請求被占用資源而發生阻塞時,對已獲得的資源保持不放。
3.不剝奪條件:任何一個資源在沒被該進程釋放之前,任何其他進程都無法對他剝奪占用
4.循環等待條件:當發生死鎖時,所等待的進程必定會形成一個環路(類似於死循環),造成永久阻塞。

  說明:T1、T2表示兩個任務;R1和R2表示兩個資源;由資源指向任務的箭頭(如R1->T1,R2->T2)表示該資源被改任務所持有;由任務指向資源的箭頭(如T1->S2,T2->S1)表示該任務正在請求對應目標資源;
    其滿足上面死鎖的四個必要條件:
(1).互斥:資源S1和S2不能被共享,同一時間只能由一個任務使用;
(2).請求與保持條件:T1持有S1的同時,請求S2;T2持有S2的同時請求S1;
(3).非剝奪條件:T1無法從T2上剝奪S2,T2也無法從T1上剝奪S1;
(4).循環等待條件:上圖中的箭頭構成環路,存在循環等待。


免責聲明!

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



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