c#实现多线程的同步方法详解

c#实现多线程的同步方法详解

ID:8967375

大小:68.50 KB

页数:12页

时间:2018-04-13

c#实现多线程的同步方法详解_第1页
c#实现多线程的同步方法详解_第2页
c#实现多线程的同步方法详解_第3页
c#实现多线程的同步方法详解_第4页
c#实现多线程的同步方法详解_第5页
资源描述:

《c#实现多线程的同步方法详解》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、C#实现多线程的同步方法详解本文主要描述在C#中线程同步的方法。线程的基本概念网上资料也很多就不再赘述了。直接接入主题,在多线程开发的应用中,线程同步是不可避免的。在.Net框架中,实现线程同步主要通过以下的几种方式来实现,在MSDN的线程指南中已经讲了几种,本文结合作者实际中用到的方式一起说明一下。1.维护自由锁(InterLocked)实现同步2.监视器(Monitor)和互斥锁(lock)3.读写锁(ReadWriteLock)4.系统内核对象1)互斥(Mutex),信号量(Semaphore),事件(AutoResetEvent/ManualResetEvent)2)线

2、程池除了以上的这些对象之外实现线程同步的还可以使用Thread.Join方法。这种方法比较简单,当你在第一个线程运行时想等待第二个线程执行结果,那么你可以让第二个线程Join进来就可以了。自由锁(InterLocked)对一个32位的整型数进行递增和递减操作来实现锁,有人会问为什么不用++或--来操作。因为在多线程中对锁进行操作必须是原子的,而++和--不具备这个能力。InterLocked类还提供了两个另外的函数Exchange,CompareExchange用于实现交换和比较交换。Exchange操作会将新值设置到变量中并返回变量的原来值:intoVal=InterLock

3、ed.Exchange(refval,1)。监视器(Monitor)在MSDN中对Monitor的描述是:Monitor类通过向单个线程授予对象锁来控制对对象的访问。Monitor类是一个静态类因此你不能通过实例化来得到类的对象。Monitor的成员可以查看MSDN,基本上Monitor的效果和lock是一样的,通过加锁操作Enter设置临界区,完成操作后使用Exit操作来释放对象锁。不过相对来说Monitor的功能更强,Moniter可以进行测试锁的状态,因此你可以控制对临界区的访问选择,等待or离开,而且Monitor还可以在释放锁之前通知指定的对象,更重要的是使用Moni

4、tor可以跨越方法来操作。Monitor提供的方法很少就只有获取锁的方法Enter,TryEnter;释放锁的方法Wait,Exit;还有消息通知方法Pulse,PulseAll。经典的Monitor操作是这样的://通监视器来创建临界区staticpublicvoidDelUser(stringname){try{//等待线程进入Monitor.Enter(Names);Names.Remove(name);Console.WriteLine("Del:{0}",Names.Count);Monitor.Pulse(Names);}finally{//释放对象锁Monitor

5、.Exit(Names);}}}其中Names是一个List,这里有一个小技巧,如果你想声明整个方法为线程同步可以使用方法属性://通过属性设置整个方法为临界区[MethodImpl(MethodImplOptions.Synchronized)]staticpublicvoidAddUser(stringname){Names.Add(name);Console.WriteLine("Add:{0}",Names.Count);}对于Monitor的使用有一个方法是比较诡异的,那就是Wait方法。在MSDN中对Wait的描述是:释放对象上的锁以便允许其他线程锁定和访问该对象。

6、这里提到的是先释放锁,那么显然我们需要先得到锁,否则调用Wait会出现异常,所以我们必须在Wait前面调用Enter方法或其他获取锁的方法,如lock,这点很重要。对应Enter方法,Monitor给出来另一种实现TryEnter。这两种方法的主要区别在于是否阻塞当前线程,Enter方法在获取不到锁时,会阻塞当前线程直到得到锁。不过缺点是如果永远得不到锁那么程序就会进入死锁状态。我们可以采用Wait来解决,在调用Wait时加入超时时限就可以。if(Monitor.TryEnter(Names)){Monitor.Wait(Names,1000);//!!Names.Remove

7、(name);Console.WriteLine("Del:{0}",Names.Count);Monitor.Pulse(Names);}互斥锁(lock)lock关键字是实现线程同步的比较简单的方式,其实就是设置一个临界区。在lock之后的{...}区块为一个临界区,当进入临界区时加互斥锁,离开临界区时释放互斥锁。MSDN对lock关键字的描述是:lock关键字可将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。具体例子如下:staticpublicvoidThr

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

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

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