线程----Monitor(互斥锁)类设置超时值
生活随笔
收集整理的這篇文章主要介紹了
线程----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(互斥锁)类设置超时值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软职位内部推荐-Principal G
- 下一篇: SCCM2012R2部署之四:配置客户端