.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(1000true))
 5            {
 6                _resource.Add(str);
 7                _mtx.ReleaseMutex();
 8            }

 9        }

10


需要注意的是
WaitOne()ReleaseMutex()必须成对出现,否则会导致进程死锁的发生,这时系统(.Net2.0)框架会抛出AbandonedMutexException异常。
剩下的内容

posted @ 2007-11-09 13:58  moonz-wu  阅读(351)  评论(0编辑  收藏  举报