互斥量 Mutex 疑问

jianshao810 2013-03-15 02:43:49

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里面到底怎样存储,竟然可以跨进程,但是却每个进程可以修改他。真搞不懂哦。
...全文
252 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
jianshao810 2013-03-15
  • 打赏
  • 举报
回复
谢谢 wuyazhe .. 原来不明白close方法的含义,close是:指针用完,需要释放,释放指针用Close,彻底不用Mutex的时候执行ReleaseMutex 上面的代码,mutex都用的是同一个。 3楼也简单明了。谢谢你们
兔子-顾问 2013-03-15
  • 打赏
  • 举报
回复
其实你可以先不调试,纯运行程序。然后调试一次,跟着走一遍就明白了。只有第一次启动的进程才需要释放,否则你释放Mutex后,就没有互斥的意义了。除了第一次,之后启动的,只需要尝试创建这个命名实力的Mutex,尝试失败则表示已经被创建过了,关闭Mutex就可以了。
菜牛 2013-03-15
  • 打赏
  • 举报
回复
程序中的Mutex对象是对内核命名互斥体对象的引用,这里Close只是关闭引用,new的时候是添加引用。当引用数为0,系统可以决定是否释放该对象。否则一直在系统中。
jianshao810 2013-03-15
  • 打赏
  • 举报
回复
谢谢楼上的高手! 关于你说的第二点,我有点不明白。我上面的代码,第一个应用程序在执行的过程中,继续打开这个exe,然后他会执行 mutex.Close(); mutex = null; 那么,为什么对第一个应用程序没影响呢? if (firstInstance) { mutex.ReleaseMutex(); } 竟然是多个进程可以访问,那么他们用的是同一个 mutex 才对吧。 虽然,我从他的行为来看,显然是每个应用程序都有自己的 mutex ,但是我一想到调用 mutex.WaitOne();时候是可以阻止其他进程执行下去的。就又发现不对啦。
gomoku 2013-03-15
  • 打赏
  • 举报
回复
1、当构造Mutex的时候指定了一个名字(@"Global\MutexSampleApp"),那么,这个Mutext就是一个命名互斥体。互斥体是操作系统内核对象,进程们就可以用名字来访问,并可以利用它来做进程间的同步。 2、mutex.Close就是表示不用该内核对象了,让系统可以决定是否销毁该内核对象。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧