C 併發用鎖 Lock關鍵字處理

2021-09-27 07:16:26 字數 1319 閱讀 7589

lock 關鍵字將語句塊標記為臨界區,方法是獲取給定物件的互斥鎖,執行語句,然後釋放該鎖。

lock語句根本使用的就是monitor.enter和monitor.exit,也就是說lock(this)時執行monitor.enter(this),大括號結束時執行monitor.exit(this).他的意義在於什麼呢,對於任何乙個物件來說,他在記憶體中的第一部分放置的是所有方法的位址,第二部分放著乙個索引,他指向clr中的syncblock cache區域中的乙個syncblock.什麼意思呢?就是說,當你執行monitor.enter(object)時,如果object的索引值為負數,就從syncblock cache中選區乙個syncblock,將其位址放在object的索引中。這樣就完成了以object為標誌的鎖定,其他的執行緒想再次進行monitor.enter(object)操作,將獲得object為正數的索引,然後就等待。直到索引變為負數,即執行緒使用monitor.exit(object)將索引變為負數。

使用lock需要注意的地方:

1.lock不能鎖定空值某一物件可以指向null,但null是不需要被釋放的。(請參考:認識全面的null)

2.lock不能鎖定string型別,雖然它也是引用型別的。因為字串型別被clr「暫留」

這意味著整個程式中任何給定字串都只有乙個例項,就是這同乙個物件表示了所有執行的應用程式域的所有執行緒中的該文字。因此,只要在應用程式程序中的任何位置處具有相同內容的字串上放置了鎖,就將鎖定應用程式中該字串的所有例項。因此,最好鎖定不會被暫留的私有或受保護成員。

3.lock鎖定的物件是乙個程式塊的記憶體邊界

4.值型別不能被lock,因為前文標紅字的「物件被釋放」,值型別不是引用型別的

5.lock就避免鎖定public 型別或不受程式控制的物件。

例如,如果該例項可以被公開訪問,則 lock(this) 可能會有問題,因為不受控制的**也可能會鎖定該物件。這可能導致死鎖,即兩個或更多個執行緒等待釋放同一物件。出於同樣的原因,鎖定公共資料型別(相比於物件)也可能導致問題。

使用lock(this)的時候,類的成員變數的值可能會被不在臨界區的方法改值了

應用場景:經常會應用於防止多執行緒操作導致公用變數值出現不確定的異常,用於確保操作的安全性

instance=new singleton();這段**是只能同時由乙個執行緒執行完畢。

private static object _lock=new object();

或者用private static readonly object _object = new object();  

lock(_lock)

}

C 用lock 關鍵字進行執行緒互斥

lock 關鍵字將語句塊標記為臨界區,方法是獲取給定物件的互斥鎖,執行語句,然後釋放該鎖。註解 lock屬於使用者態的執行緒同步,所占用的開銷比核心態小 lock 關鍵字可確保當乙個執行緒位於 的臨界區時,另乙個執行緒不會進入該臨界區。如果其他執行緒嘗試進入鎖定的 則它將一直等待 即被阻止 直到該物...

C 中lock關鍵字的作用

lock 關鍵字可以用來確保 塊完成執行,而不會被其他執行緒中斷。這是通過在 塊執行期間為給定物件獲取互斥鎖來實現的。假設執行緒a先執行,執行緒b稍微慢一點。執行緒a執行到lock語句,判斷obj是否已申請了互斥鎖,判斷依據是逐個與已存在的鎖進行object.referenceequals比較 此處...

描述C 多執行緒中 lock關鍵字

描述c 多執行緒中 lock關鍵字 本文介紹c lock 關鍵字,c 提供了乙個關鍵字lock,它可以把一段 定義為互斥段 critical section 互斥段在乙個時刻內只允許乙個執行緒進入執行,而其他執行緒必須等待。每個執行緒都有自己的資源,但是 區是共享的,即每個執行緒都可以執行相同的函式...