c#多线程编程笔记4

c#多线程编程笔记4

ID:41032250

大小:60.50 KB

页数:9页

时间:2019-08-14

c#多线程编程笔记4_第1页
c#多线程编程笔记4_第2页
c#多线程编程笔记4_第3页
c#多线程编程笔记4_第4页
c#多线程编程笔记4_第5页
资源描述:

《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):释放对象上的锁并阻止当前线程,直到它重新

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。