C#中多线程同步的Monitor理解
生活随笔
收集整理的這篇文章主要介紹了
C#中多线程同步的Monitor理解
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
.NET提供了System.Threading.Monitor類允許同一進(jìn)城中的線程實(shí)現(xiàn)同步,是一種更快速、更輕量級(jí)的鎖機(jī)制。可以使用該類來保護(hù)對(duì)某些變量的訪問,或?qū)δ承┮淮沃荒茉谝粋€(gè)線程中執(zhí)行的代碼設(shè)置訪問權(quán)限。
使用實(shí)例(片段代碼):
- Monitor與lock
對(duì)以上代碼的解讀: - Monitor.Enter(theLock)獲得theLock對(duì)象鎖;Monitor.Exit(theLock)釋放theLock對(duì)象鎖;
- 我們將所有對(duì)num變量的訪問以對(duì)象鎖的形式房在臨界區(qū),在每次訪問前,訪問者必須獲得theLock對(duì)象實(shí)例的鎖。theLock字段類型是 Object類型,它的實(shí)際類型無關(guān)緊要,但必須是引用類型即對(duì)象的實(shí)例,而不是值類型。為了安全起見,建議標(biāo)記成readonly,以免theLock 被復(fù)制而造成混亂。
- 上述代碼不夠簡(jiǎn)潔,使用try/finally,而且一旦漏掉Monitor.Exit將會(huì)發(fā)生可怕的混亂。就此問題C#設(shè)計(jì)者引用了lock關(guān)鍵字,lock關(guān)鍵字代替了Monitor.Enter和Monitor.Exit,上述代碼可簡(jiǎn)寫為: readonly object theLock=new object();int num=0;#其他代碼...lock(theLock){++num;}
- 通知與等待
- Monitor管理著兩個(gè)線程隊(duì)列:就緒隊(duì)列(ready隊(duì)列)和等待隊(duì)列(waiting隊(duì)列)。
- ready隊(duì)列保存的是準(zhǔn)備獲取鎖的線程,就是說,如果某個(gè)線程(幾座線程A)執(zhí)行了Monitor.Wait(),那么ready隊(duì)列中的第一個(gè)線程就會(huì)獲得鎖,開始運(yùn)行;同時(shí)線程A自動(dòng)進(jìn)入waiting隊(duì)列中的隊(duì)尾進(jìn)行排隊(duì)。
- waiting隊(duì)列保存的是正在等待鎖對(duì)象狀態(tài)變化通知的線程,就是說如果某個(gè)線程執(zhí)行了Moniotr.Pulse(),那么waiting隊(duì)列中的對(duì)頭線程就進(jìn)入ready隊(duì)列中。
- 簡(jiǎn)單地說即是當(dāng)前線程執(zhí)行Monitor.Wait(),當(dāng)前線程進(jìn)入waiting隊(duì)列并取ready隊(duì)列對(duì)頭線程運(yùn)行;執(zhí)行Monitor.Pulse把waiting隊(duì)列的對(duì)頭線程調(diào)入ready隊(duì)列。
轉(zhuǎn)載于:https://www.cnblogs.com/zhaiqianfeng/archive/2012/11/06/4617989.html
總結(jié)
以上是生活随笔為你收集整理的C#中多线程同步的Monitor理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Visual C++ 2008入门经典
- 下一篇: 解决Putty中左边 alt+b 不工作