.Net线程同步的n个方法(二)
@_@互斥对象(Mutex)
互斥对象的作用有点类似于监视器对象,确保一个代码块在同一时刻只有一个线程在执行。互斥对象和监视器对象的主要区别就是,互斥对象一般用于跨进程间的线程同步,而监视器对象则用于进程内的线程同步。互斥对象有两种:一种是命名互斥;另一种是匿名互斥。在跨进程中使用到的就是命名互斥,一个已命名的互斥就是一个系统级的互斥它可以被其他进程所使用,只要在创建互斥是指定打开互斥的名称就可以。在.Net中互斥是通过Mutex类来实现。
Mutex mtx = Mutex.OpenExisting(name);
其实对于OpenExisting函数有两个重载版本:
Mutex.OpenExisting (String)
Mutex.OpenExisting (String, MutexRights)
对于默认的第一个函数其实是实现了第二个函数 MutexRights.Synchronize|MutexRights.Modify操作。
由于监视器的设计是基于.Net框架,而Mutex类是系统内核对象封装了win32的一个内核结构来实现互斥,并且互斥操作需要请求中断来完成,因此在进行进程内线程同步的时候,监视器性能上要好于互斥对象。
典型的利用Mutex同步需要完成三个步骤的操作:一、打开或者创建一个Mutex实例;二、调用WaitOne()来请求互斥对象;三、最后调用ReleaseMutex来释放互斥对象。
1 static public void AddString(string str)
2 {
3 // 设置超时时限并在wait前退出非默认托管上下文
4 if (_mtx.WaitOne(1000, true))
5 {
6 _resource.Add(str);
7 _mtx.ReleaseMutex();
8 }
9 }
10
2 {
3 // 设置超时时限并在wait前退出非默认托管上下文
4 if (_mtx.WaitOne(1000, true))
5 {
6 _resource.Add(str);
7 _mtx.ReleaseMutex();
8 }
9 }
10
需要注意的是WaitOne()和ReleaseMutex()必须成对出现,否则会导致进程死锁的发生,这时系统(.Net2.0)框架会抛出AbandonedMutexException异常。
剩下的内容
将想法付诸于实践,借此来影响他人是一个人存在的真正价值