日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

C#中多线程同步的Monitor理解

發布時間:2025/4/14 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#中多线程同步的Monitor理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

.NET提供了System.Threading.Monitor類允許同一進城中的線程實現同步,是一種更快速、更輕量級的鎖機制。可以使用該類來保護對某些變量的訪問,或對某些一次只能在一個線程中執行的代碼設置訪問權限。
使用實例(片段代碼):

readonly object theLock=new object();int num=0;#其他代碼...Monitor.Enter(theLock);try{++num;}finally{Monitor.Exit(theLock);}
  • Monitor與lock
    對以上代碼的解讀:
  • Monitor.Enter(theLock)獲得theLock對象鎖;Monitor.Exit(theLock)釋放theLock對象鎖;
  • 我們將所有對num變量的訪問以對象鎖的形式房在臨界區,在每次訪問前,訪問者必須獲得theLock對象實例的鎖。theLock字段類型是 Object類型,它的實際類型無關緊要,但必須是引用類型即對象的實例,而不是值類型。為了安全起見,建議標記成readonly,以免theLock 被復制而造成混亂。
  • 上述代碼不夠簡潔,使用try/finally,而且一旦漏掉Monitor.Exit將會發生可怕的混亂。就此問題C#設計者引用了lock關鍵字,lock關鍵字代替了Monitor.Enter和Monitor.Exit,上述代碼可簡寫為: readonly object theLock=new object();int num=0;#其他代碼...lock(theLock){++num;}
  • 通知與等待
    • Monitor管理著兩個線程隊列:就緒隊列(ready隊列)和等待隊列(waiting隊列)。
    • ready隊列保存的是準備獲取鎖的線程,就是說,如果某個線程(幾座線程A)執行了Monitor.Wait(),那么ready隊列中的第一個線程就會獲得鎖,開始運行;同時線程A自動進入waiting隊列中的隊尾進行排隊。
    • waiting隊列保存的是正在等待鎖對象狀態變化通知的線程,就是說如果某個線程執行了Moniotr.Pulse(),那么waiting隊列中的對頭線程就進入ready隊列中。
    • 簡單地說即是當前線程執行Monitor.Wait(),當前線程進入waiting隊列并取ready隊列對頭線程運行;執行Monitor.Pulse把waiting隊列的對頭線程調入ready隊列。

轉載于:https://www.cnblogs.com/zhaiqianfeng/archive/2012/11/06/4617989.html

總結

以上是生活随笔為你收集整理的C#中多线程同步的Monitor理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。