- 1、本文档共13页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C线程资源同步方式总结
HYPERLINK /VincentWP/archive/2008/06/25/1229104.html C# 线程资源同步方式总结
????????在现代的程序开发中,资源的同步是一个比较重要的课题,在.Net中,对这部分有很丰富类库供我们使用,现在总结一下在各种情况下对资源同步的机制。?????1.将字段声明为volatile???????????????当一个字段被声明为volatile时,CLR中一些管理代码和内存的内部机制将负责对字段进行同步,并且总能保证读取到的字段信息都为最新的值,被声明为volatile的字段必须具备以下特征之一?????????????????1.为引用类型??????? 2.一个指针(在不安全代码中)??????? 3.sbyte,byte,short,ushort,int,uint,char,float,bool????????4.一个使用底层类型的枚举类型?????2.使用System.Threading.Interlocked 类?????????在许多增对整数的操作中,我们都比较容易忽视线程的问题,例如执行下列代码???????? i = i + 1;???????? 实际上,上述代码分为3步骤????????????? 1).? 从内存中,读取i的值????????????? 2).? 将读取出来的值加1????????????? 3).? 将新的值写入内存中?????????在单线程上,这个操作不会有任何问题,但是当i被多个线程访问时,问题就出现了,对i进行修改的线程,在上述的任何一部都有可能被其它读取线程打断,想象一下,当操作线程执行完第二步,准备将新的值写入内存中时,此时其它读取线程获得了执行权,这时读取到的i的值并不是我们想要的,因此,这个操作不具备原子性,在.Net中,使用Interlocked类能确保操作的原子性,Interlocked类有以下的方法????????? Increment??????????Decrement????????? Exchange??????????????????上述的方法的参数都为带ref 标识的参数,因此我们说,这些方法保证了数据的原子性,在多线程中,涉及到整数的操作时,数据的原子性值得考虑,Interlocked的操作代码如下?????
????????????int?i?=?0;????????????System.Threading.Interlocked.Increment(ref?i);????????????Console.WriteLine(i);????????????System.Threading.Interlocked.Decrement(ref?i);????????????Console.WriteLine(i);????????????System.Threading.Interlocked.Exchange(ref?i,?100);????????????Console.WriteLine(i);
????????? 输出信息如下?????????????????3.使用lock关键字??????????????????????地球人都知道,使用lock关键字可以获取一个对象的独占权,任何需要获取这个对象的操作的线程必须等待以获取该对象的线程释放独占权,lock提供了简单的同步资源的方法,与Java中的synchronized关键字类似。????????? lock关键字的使用示例代码如下
object?o?=?new?object();????????????lock?(o)????????????{????????????????Console.WriteLine(O);????????????}
?????? 4.使用System.Theading.Monitor类进行同步????????? System.Threading.Monitor类提供了与lock类似的功能,不过与lock不同的是,它能更好的控制同步块,当调用了Monitor的Enter(Object o)方法时,会获取o的独占权,直到调用Exit(Object o)方法时,才会释放对o的独占权,可以多次调用Enter(Object o)方法,只需要调用同样次数的Exit(Object o)方法即可,Monitor类同时提供了TryEnter(Object o,[int])的一个重载方法,该方法尝试获取o对象的独占权,当获取独占权失败时,将返回false,查看如下代码??????????
using?System;
文档评论(0)