欢迎来到天天文库
浏览记录
ID:41032250
大小:60.50 KB
页数:9页
时间:2019-08-14
《c#多线程编程笔记4》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、c#多线程编程笔记4a) 使用Monitor类Monitor类提供了锁定部分代码的简单机制,只要把受保护的代码包装在Monitor.Enter与Monitor.Exit代码块中就行了。Monitor.Enter方法与Monitor.Exit方法都有一个参数。Monitor.Enter(object[obj]);Monitor.Exit(object[obj]).这个参数就是需要Monitor锁定的对象,它应该是一个引用类型,而不是值类型。Monitor具有以下功能:(摘自MSDN)它根
2、据需要与某个对象相关联。它是未绑定的,也就是说可以直接从任何上下文调用它。不能创建Monitor类的实例。例子6:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Threading; namespaceConsoleApplication1{publicclassMonitorClass6{protectedstaticintm_iCounter=0;publicvoidIncrement(){m_i
3、Counter++;}publicintCounter{get{returnm_iCounter;}}}publicclasstest{publicMonitorClass6mc6=newMonitorClass6(); publicvoidincreseMC6(){Monitor.Enter(mc6);//进入临界区try{mc6.Increment();Console.WriteLine("线程{0}的值为{1}",Thread.CurrentThread.Name,mc6.Counter);
4、}finally{Monitor.Exit(mc6);//退出临界区}}} publicclassMainEntryPoint{publicstatictestmyTest=newtest();publicstaticvoidMain(){ThreadStartts1=newThreadStart(execute);Threadt1=newThread(ts1);t1.Name="Thread1"; ThreadStartts2=newThreadStart(execute1);Threadt2=
5、newThread(ts2);t2.Name="Thread2"; t1.Start();t2.Start();Console.Read();} publicstaticvoidexecute(){for(inti=0;i<5;i++){myTest.increseMC6();}}publicstaticvoidexecute1(){for(inti=0;i<5;i++){myTest.increseMC6();}}}}执行结果如下:可以看到它没有经过顺序上的紊乱就达到10;如果我们把两个有带有M
6、onitor注释掉,结果会变成下图所示(您机子上的结果也许顺序不一样):可以看出,由于我们没有对临界资源加以控制,而形成了我们不需要的“脏”数据!也许细心的你会发现这个Monitor类的形式与使用LOCK关键字基本一致,但我认为它比lock关键字强大一些,因为Monitor类还具有TryEnter(试图获取指定对象的排他锁)、Wait(释放对象上的锁并阻止当前线程)、Pulse(能知等待队列中的线程锁定对象状态的更改)以及PulseAll(通知所有的等待线程的对象状态已改变)等方法。l
7、 TtyEnter其方法的重载:Monitor.TryEnter(Object):试图获得指定对象的排他锁Monitor.TryEnter(Object,Int32):在指定的毫秒数内尝试获取指定对象上的排他锁Monitor.TryEnter(Object,TimeSpan):在指定的时间量内尝试获取指定对象上的排他锁将例子6的increseMC6方法改为如下:publicvoidincreseMC6(){if(Monitor.TryEnter(mc6))//进入临界区{try{mc6.Incr
8、ement();Console.WriteLine("线程{0}的值为{1}",Thread.CurrentThread.Name,mc6.Counter);}finally{Monitor.Exit(mc6);//退出临界区}}else{Console.WriteLine("线程{0}没有竞得资源",Thread.CurrentThread.Name);}}}l Wait其方法的重载:Monitor.Wait(Object):释放对象上的锁并阻止当前线程,直到它重新
此文档下载收益归作者所有