NET多线程同步方法详解(四):系统内核对象 互斥对象(Mutex)

来源:互联网 发布:微赞源码下载 编辑:程序博客网 时间:2024/06/10 07:15
互斥对象的作用有点类似于监视器对象,确保一个代码块在同一时刻只有一个线程在执行。互斥对象和监视器对象的主要区别就是,互斥对象一般用于跨进程间的线程同步,而监视器对象则用于进程内的线程同步。互斥对象有两种:一种是命名互斥;另一种是匿名互斥。在跨进程中使用到的就是命名互斥,一个已命名的互斥就是一个系统级的互斥,它可以被其他进程所使用,只要在创建互斥时指定打开互斥的名称就可以。在.Net中互斥是通过Mutex类来实现。 

  其实对于OpenExisting函数有两个重载版本,
   Mutex.OpenExisting (String)
   Mutex.OpenExisting (String, MutexRights) 
   对于默认的第一个函数其实是实现了第二个函数 MutexRights.Synchronize|MutexRights.Modify操作。

    由于监视器的设计是基于.Net框架,而Mutex类是系统内核对象封装了win32的一个内核结构来实现互斥,并且互斥操作需要请求中断来完成,因此在进行进程内线程同步的时候性能上要比互斥要好。

    典型的使用Mutex同步需要完成三个步骤的操作:1.打开或者创建一个Mutex实例;2.调用WaitOne()来请求互斥对象;3.最后调用ReleaseMutex来释放互斥对象。

        static public void AddString(string str) 
        {
            
// 设置超时时限并在wait前退出非默认托管上下文 
            if (_mtx.WaitOne(1000true))
            {
                _resource.Add(str); 
                _mtx.ReleaseMutex(); 
            } 
        } 

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