執行緒同步之臨界區

2021-09-02 14:01:07 字數 1090 閱讀 9592

臨界區:當兩個執行緒競爭同一資源時,如果對資源的訪問順序敏感,就稱存在競態條件。導致競態條件發生的**區稱作臨界區。

臨界區執行緒同步適用範圍:它只能同步乙個程序中的執行緒,不能跨程序同步。一般用它來做單個程序內的**快同步,效率比較高。

在.net中有monitor、lock等方式是以臨界區的方式來實現執行緒同步的,我們看一下兩者的具體示例。

1、lock  lock關鍵字將**塊標記為臨界區,方法是獲取指定物件的互斥鎖,執行語句,然後釋放鎖,這樣其它執行緒就可以接著獲取鎖來進入臨界區。

lock關鍵字保證了臨界資源在同一時刻只能有唯一乙個執行緒訪問,一旦有執行緒獲取互斥鎖,進入臨界區,其它執行緒訪問時就會被掛起,直到當前執行緒釋放鎖。

private static object lockobj = new object();

lock(lockobj)

對於任何乙個引用物件都存在乙個索引,該索引指向clr中syncblock cache中的syncblock。當執行lock(object)時,如果object索引值為負數,就從syncblock cache

中取出乙個syncblock,存入object索引值,這樣object索引值就變成了正數。當有其它執行緒再進入時lock(object)時發現object索引值不為負,責掛起等待,直到object索引

值變為負數。

使用lock應注意

1)lock不能鎖定null值

2)lock不能鎖定string型別的值,雖然它是引用型別,旦字串型別被clr暫留

3)lock鎖定的必須是引用型別,不能是值型別

4)lock避免鎖定public物件,因為公開的物件可能被其它類進行修改,很可能導致死鎖。如lock(this)時,當前物件的公開屬性值被修改後,會造成執行緒安全問題

2、monitor的用法

monitor類使用enter(object)和exit(object)來標示臨界區,事實上lock使用的原理就是monitor。當lock開始是呼叫就是monitor.enter(object),當lock結束時

則呼叫monitor.exit(object)釋放object鎖。

學習什麼時候都不晚,從現在起我們一起

出處

windows多執行緒同步 臨界區

推薦參考部落格 秒殺多執行緒第五篇 經典執行緒同步 關鍵段cs 關於臨界區的觀念,一般作業系統書上面都有。適用範圍 它只能同步乙個程序中的執行緒,不能跨程序同步。一般用它來做單個程序內的 快同步,效率比較高 windows中與臨界區有關的結構是 critical section,關於該結構體的內部結...

雙線程臨界區實現

windowsxp vc6環境下雙線程臨界區實現 include include include int threadflag 2 執行緒標誌 int door 進入標誌 long crtsec 0 衝突域 handle lock 訊號量 critical section cs int allnum...

多執行緒程式設計 臨界區

1 windows api建立執行緒 include 包含相應標頭檔案 include dword winapi myfun1 lpvoid lpparameter 宣告執行緒函式 dword winapi myfun2 lpvoid lpparameter int main 主函式 else 如果...