日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线程----Monitor(互斥锁)类设置超时值

發布時間:2025/3/8 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线程----Monitor(互斥锁)类设置超时值 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Monitor類與Lock語句相比,Monitor類的主要優點是:可以添加一個等待被鎖定的超時值。

缺點:開銷非常大

?

using?System; using?System.Collections.Generic; using?System.Linq; using?System.Text; using?System.Threading.Tasks; using?System.Threading; namespace?ConsoleApplication2 {class?Program{static?void?Main(string[]?args){ShareClass?sc?=?new?ShareClass();Job?j=new?Job?(sc);Task[]?ts=new??Task[20];for?(int?i?=?0;?i?<?20;?i++){ts[i]?=?new?Task(j.TheDoJob2);ts[i].Start();}for?(int?i?=?0;?i?<?20;?i++){ts[i].Wait();}Console.WriteLine(sc.state);Console.ReadKey();}}class?ShareClass{public?int?state?{?get;?set;?}}class?Job{ShareClass?sc?{?get;?set;?}private?object?obj?=?new?object();public?Job(ShareClass?s){sc?=?s;}//==========普通的Monitor類public?void?TheDoJob(){//鎖定Monitor.Enter(obj);try{for?(int?i?=?0;?i?<?10000;?i++){sc.state++;}}catch?{?}finally{//如果拋出異常也會就出鎖//釋放鎖Monitor.Exit(obj);?}}//===========給Monitor類設置超時時間public?void?TheDoJob2(){bool?yesno=false;//鎖定Monitor.TryEnter(obj,?100,?ref?yesno);if?(yesno){for?(int?i?=?0;?i?<?10000;?i++){sc.state++;}Console.WriteLine("yes");//釋放鎖Monitor.Exit(obj);}else{//如果超時會執行下面代碼Console.WriteLine("no");}}} }

?

?TheDoJob()

?

?

?TheDoJob2()

?

?

?

?=================================SpinLock(自旋鎖)

????????如果基于對象的的鎖定對象(Monitor)的系統開銷由于垃圾回收而過高,就可以使用SpinLock結構。如果有大量的鎖定,且鎖定的時間是非常短,自旋鎖就很有用。

?

*注意:

????????傳送SpinLock實例時要小心。因為SpinLock定義為結構,把一個變量賦予另一個變量會創建副本。總是通過引用傳送SpinLock實例。

?

例子:

using?System; using?System.Collections.Generic; using?System.Linq; using?System.Text; using?System.Threading.Tasks; using?System.Threading; namespace?ConsoleApplication5 {class?Program{static?void?Main(string[]?args){ShareClass?sc?=?new?ShareClass();Job?j?=?new?Job(sc);int?sum?=?20;Task[]?t?=?new?Task[sum];//開啟20個任務for?(int?i?=?0;?i?<?sum;?i++){t[i]?=?new?Task(j.JobStart);t[i].Start();}//等待20個任務全部結束for?(int?i?=?0;?i?<?sum;?i++){t[i].Wait();}Console.WriteLine(sc.State);Console.ReadKey();}}//共享類class?ShareClass{public?int?State?{?get;?set;?}}class?Job{//聲明一個自旋鎖,自旋鎖是一個結構(不能為屬性)private?SpinLock?sl;//共享類private?ShareClass?sc;public?Job(ShareClass?_sc){this.sc?=?_sc;this.sl?=?new?SpinLock();}public?void?JobStart(){//并行循環Parallel.For(0,?10000,?i?=>{bool?spinToken?=?false;sl.Enter(ref?spinToken);//鎖定try{sc.State++;}finally{if?(spinToken)sl.Exit();//釋放鎖}});}} }

?

轉載于:https://blog.51cto.com/962410314/1612134

總結

以上是生活随笔為你收集整理的线程----Monitor(互斥锁)类设置超时值的全部內容,希望文章能夠幫你解決所遇到的問題。

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