一尘晓灰

但却感觉距离还是很远...

C#.NET中的同步策略

本文主要描述的是线程同步实现的策略,线程同步类的相关内容:C#.NET中的线程同步类(一)

.NET的公共语言基础结构(CLI)提供了3种策略去同步访问实例、静态方法和实例字段。

同步上下文

上下文是一组属性或使用规则,这组属性使用规则对执行时相关的对象集合是通用的,在对象激活期间创建。新对象被放置到现有上下文或新的上下文中,后者是通过元数据类型中包含的属性创建。使用提供用法规则的ContextAttribute标记上下文绑定类,可添加的上下文属性包括有关同步和事务的策略。关于上下文的示例:C#.NET中的上下文

.NET中同步上下文的策略将使用SynchronizationAttribute类对ContextBoundObject对象进行简单的自动同步。.NET在每种方法调用前锁定对象,方法返回后释放对象。SynchronizatonAttribute类包含了实例变量、实例方法和应用这个属性的类的实例字段,但它不处理静态字段和方法的同步,如果必须同步特定的代码块,它也不起作用。

使用SyncronizationAttribute将类变成具有线程安全性的示例代码如下:

//public enum SynchronizationOption Member of System.EnterpriseServices
//[Synchronization(SynchronizationOption.Required)] 无参数构造函数默认为SynchronizationOption.Required
[SynchronizationAttribute()]
class ObjectClass : ContextBoundObject
{
	public object Function(object input)
	{
		//Do something...
	}
}

SynchronizationAttribute对于缺乏同步经验的程序员来说,使用起来很方便。

同步代码区

第二种策略是特定代码段的锁定,既重要的代码段只能限制地访问。.NET中实现这种策略的类有Monitor/lock/ReaderWriterLock等,网上很多这些类的解释及使用说明,在此不多提。

手控同步

第三种策略中,.NET Framework提供了一些经典的技术,允许使用类似于WIN32线程API的低级线程API创建和管理多线程应用程序。System.Threading命名空间中的一些手控同步类有:AutoResetEvent/ManualResetEvent/Mutex/Interlocked。此外还有一个ThreadStaticAttribute类,ThreadStaticAttribute用于在静态变量上为每个执行它的线程创建一个单独的变量,而不是在线程之间共享(默认行为)静态变量。

ManualResetEvent类:ManualResetEvent对象只能拥有两种状态之一,有信号(True)或无信号(False)。ManualResetEvent类继承于WaitHandle类,其构造函数的参数可确定对象的初始状态。Set()和Reset()方法返回一个布尔值,表示是否进行了成功的修改。

AutoResetEvent类:AutoResetEvent类的工作方式类似于ManualResetEvent类。它等待时间超时或者事件变成有信号状态,接着将此事件通知等待线程。ManualResetEvent和AutoResetEvent的一个重要区别是AutoResetEvent在WaitOne()方法中改变状态。

Mutex类:正如ManualResetEvent和AutoResetEvent类,Mutex类也是从WaitHandle类派生出来的。除了可以用于进程间同步之外,Mutex类非常类似于Monitor类。示例在其它的读书笔记里有列出。

Interlocked类:Interlocked同步访问一个由许多线程共享的变量。这个操作以原子操作的方式实现。此类常用的静态方法有:Increment()/Decrement/Exchange()等。

ThreadStaticAttribute类:带有ThreadStaticAttribute的静态变量不会在访问该变量的不同线程之间共享。每个访问变量的线程都有该变量的一个副本。如果一个线程修改了变量,另一个访问变量的线程就不能看到这些变化。这种行为是有背于静态变量的默认行为的。

以上内容只是提到为止,更详细的分析理解学习正在实践中...

阅读更多
个人分类: 读书笔记
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭