首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

互斥量 Mutex 疑义

2013-03-17 
互斥量 Mutex 疑问class MutexSample2{private static Mutex mutex null//设为Static成员,是为了在整个

互斥量 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就可以了。

热点排行