多线程下的进程同步线程同步问题总结篇

多线程下的进程同步线程同步问题总结篇

ID:29491358

大小:85.66 KB

页数:15页

时间:2018-12-20

多线程下的进程同步线程同步问题总结篇_第1页
多线程下的进程同步线程同步问题总结篇_第2页
多线程下的进程同步线程同步问题总结篇_第3页
多线程下的进程同步线程同步问题总结篇_第4页
多线程下的进程同步线程同步问题总结篇_第5页
资源描述:

《多线程下的进程同步线程同步问题总结篇》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、多线程下的进程同步线程同步问题总结篇之前写过两篇关于线程同步问题的文章(一,二),这篇中将对相关话题进行总结,本文中也对.NET4.0中新增的一些同步机制进行了介绍。首先需要说明的是为什么需要线程功能同步。MSDN中有这样一段话很好的解释了这个问题:当多个线程可以调用单个对象的属性和方法时,对这些调用进行同步处理是非常重要的。否则,一个线程可能会中断另一个线程正在执行的任务,使该对象处于一种无效状态。也就说在默认无同步的情况下,任何线程都可以随时访问任何方法或字段,但一次只能有一个线程访问这些对象。另外,MSDN中也给出定义,成员不受多线程调用中断影响的类即线程安全类。CLI提供了

2、几种可用来同步对实例和静态成员的访问的策略(前面两边文章介绍了这其中大部分机制):?同步代码区域:可以使用Monitor类或(编译器支持的语法,如C#中的lock关键字)来同步需要安全的接受并发请求的代码段,这种方式比其他等效的同步方法有更好的性能。lock语句通过Monitor的Enter和Exit方法实现代码段同步,使用trycatchfinally结构确保锁被释放。当线程执行该代码时,会尝试获取锁。如果该锁已由其他线程获取,则在锁变为可用状态之前,该线程一直处于阻塞状态。当线程退出同步代码块时,锁就会被释放,这与线程的退出方式无关。通常情况下同步一小代码块并且不跨越多个方法的

3、最佳选择是lock语句,Monitor类功能强大但使用不当容易出现孤立锁与死锁,而由于lock是通过Monitor的Enter和Exit实现的,因此在临界区中可以结合Monitor的其它方法一起使用。另外可以通过[MethodImpl(MethodImplOptions.Synchronized)]特性标记一个方法是需要被同步的,方法可以是实例方法也可以是静态方法。最终实现的效果与使用lock关键字或Monitor相关方法相同。注意不要在此特性标记的方法内使用lock(this)/lock(typeof(this))(注意,单独使用lock时也不应用对象本身或类型作为锁(应为类型或

4、实例可能被其它机制锁定,如被[MethodImpl(MethodImplOptions.Synchronized)]标记),对于实例方法与静态方法最好分别使用声明新的私有成员或静态私有成员作为锁,避免使用公有成员作为锁)。另外不能对字符串加锁。?手动同步:.NETFramework中提供一些类用于手动进行线程间的访问同步。这些类主要分为3大类别(但正如下文中会看到的这些类别划分并非绝对,某些同步机制在多个类别之间有交叉):ü锁定ü通知ü连锁操作1.锁定排他锁独占锁最常见的形式就是C#的lock语句,该语句控制对一个代码块的访问,这个代码块被称作临界区。详见前文xx中对lock的介绍

5、。Monitor类Monitor类提供了许多附加功能,这些功能可以与lock关键字结合使用(在lock的临界区中调用Monitor类的方法)。更多细节见线程同步问题1方法二中的介绍。Mutex类Mutex的作用也是创建一个临界区以同步对其中对象的访问,方式类似Monitor类,但最大的不同是Mutex支持跨进程的同步。当然其效率也不如Monitor类,在同一进程内通信应首先考虑使用Monitor。Mutex的介绍详见线程同步问题2方法五中的介绍。SpinLock类.NET4.0中新增当Monitor所需的开销会造成性能下降时,可以使用SpinLock类。当SpinLock请求进入临

6、界区时,会反复地旋转(执行空循环),直至锁变为可用的。如果请求锁所需时间非常短,则空转可比阻塞提供更好的性能。但是,如果锁保留数十个周期以上,则SpinLock的表现会和Monitor一样,而且将使用更多的CPU周期,降低其他线程或进程的性能。其它锁有些时候锁不必独占,可以允许一定数目的线程并发访问某个资源。下面列举的锁即用于这个目的。ReaderWriterLock类允许多个线程同时读取一个资源,但在向该资源写入时要求线程等待以获得独占锁。更多细节见线程同步问题1方法三中的介绍。Semaphore类Semaphore类允许指定数目的线程访问某个资源。超过这个数目时,请求该资源的其

7、他线程会一直阻塞,直到某个线程释放信号量。更多细节见线程同步问题2方法七中的介绍。ReaderWriterLockSlim类.NET4.0中新增这个类的作用与ReaderWriterLock类完全一致,其拥有更好的性能,在新开发的程序中应当使用ReaderWriterLockSlim而不是ReaderWriterLock。ReaderWriterLockSlim具有线程关联。SemaphoreSlim类.NET4.0中新增SemaphoreSlim类是用于在单一进程边

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

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

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