读书人

互斥量 Mutex 疑义

发布时间: 2013-03-17 13:48:32 作者: rapoo

互斥量 Mutex 疑问


class MutexSample2
{
private static Mutex mutex = null; //设为Static成员,是为了在整个程序生命周期内持有Mutex

static void Main()
{
bool firstInstance;

mutex = new Mutex(true, @"Global\MutexSampleApp", out firstInstance);
try
{
if (!firstInstance)
{
Console.WriteLine("已有实例运行,输入回车退出……");
Console.ReadLine();
return;
}
else
{
Console.WriteLine("我们是第一个实例!");
for (int i = 60; i > 0; --i)
{
Console.WriteLine(i);
Thread.Sleep(1000);
}
}
}
finally
{
//只有第一个实例获得控制权,因此只有在这种情况下才需要ReleaseMutex,否则会引发异常。
if (firstInstance)
{
mutex.ReleaseMutex();
}
mutex.Close();
mutex = null;
}


}
}


百思不得其解,首先 private static Mutex mutex 这个是属于类的,这里注释也说明不啦,整个应用程序周期也有,实例化的时候也声明是全局的。但是在每个应用程序后面都加上
mutex.Close();
我就不解了。
mutex = null;
我稍微理解,只是将该应用程序的mutex指针去掉,并没有对实例对象影响。但是 为什么需要mutex.Close();
进行释放呢?而不是放在mutex.ReleaseMutex();后面。
Mutex 实例在 clr里面到底怎样存储,竟然可以跨进程,但是却每个进程可以修改他。真搞不懂哦。 互斥量?Mutex?-?[Tech]
[解决办法]
1、当构造Mutex的时候指定了一个名字(@"Global\MutexSampleApp"),那么,这个Mutext就是一个命名互斥体。互斥体是操作系统内核对象,进程们就可以用名字来访问,并可以利用它来做进程间的同步。

2、mutex.Close就是表示不用该内核对象了,让系统可以决定是否销毁该内核对象。


[解决办法]
程序中的Mutex对象是对内核命名互斥体对象的引用,这里Close只是关闭引用,new的时候是添加引用。当引用数为0,系统可以决定是否释放该对象。否则一直在系统中。
[解决办法]
其实你可以先不调试,纯运行程序。然后调试一次,跟着走一遍就明白了。只有第一次启动的进程才需要释放,否则你释放Mutex后,就没有互斥的意义了。除了第一次,之后启动的,只需要尝试创建这个命名实力的Mutex,尝试失败则表示已经被创建过了,关闭Mutex就可以了。

读书人网 >C#

热点推荐