.NET多线程同步方法详解(四):系统内核对象 互斥对象(Mutex)
2007-10-30 17:10
295 查看
互斥对象的作用有点类似于监视器对象,确保一个代码块在同一时刻只有一个线程在执行。互斥对象和监视器对象的主要区别就是,互斥对象一般用于跨进程间的线程同步,而监视器对象则用于进程内的线程同步。互斥对象有两种:一种是命名互斥;另一种是匿名互斥。在跨进程中使用到的就是命名互斥,一个已命名的互斥就是一个系统级的互斥,它可以被其他进程所使用,只要在创建互斥时指定打开互斥的名称就可以。在.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(1000, true))
{
_resource.Add(str);
_mtx.ReleaseMutex();
}
}
需要注意的是,WaitOne和ReleaseMutex必须成对出现,否则会导致进程死锁的发生,这时系统(.Net2.0)框架会抛出AbandonedMutexException异常。
其实对于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(1000, true))
{
_resource.Add(str);
_mtx.ReleaseMutex();
}
}
需要注意的是,WaitOne和ReleaseMutex必须成对出现,否则会导致进程死锁的发生,这时系统(.Net2.0)框架会抛出AbandonedMutexException异常。
相关文章推荐
- NET多线程同步方法详解(四):系统内核对象 互斥对象(Mutex)
- NET多线程同步方法详解(一):自由锁(InterLocked)
- NET多线程同步方法详解(六):事件(ManualResetEvent/AutoResetEvent)
- .NET多线程同步方法详解(七):线程池(Thread Pooling)
- NET多线程同步方法详解(一):自由锁(InterLocked)
- Asp.Net中调用win32系统内核功能的实现方法
- NET多线程同步方法详解(三):读写锁(ReadWriteLock) 收藏
- NET多线程同步方法详解(三):读写锁(ReadWriteLock)
- NET多线程同步方法详解(五):信号量(Semaphore)
- NET多线程同步方法详解(二):互斥锁(lock) 收藏
- asp.net中C#对象与方法 属性详解
- asp.net获取系统当前时间的方法详解
- NET多线程同步方法详解(五):信号量(Semaphore)
- NET多线程同步方法详解(一):自由锁(InterLocked)
- NET多线程同步方法详解(六):事件(ManualResetEvent/AutoResetEvent)
- 详解Android获取系统内核版本的方法与实现代码
- NET多线程同步方法详解(三):读写锁(ReadWriteLock)
- 第9章 用内核对象进行线程同步(3)_信号量(semaphore)、互斥对象(mutex)
- 互斥对象是一个分成简单的多线程同步的内核对象。
- NET多线程同步方法详解(二):互斥锁(lock)