Mutex互斥锁的使用方法

Posted gougou1981

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mutex互斥锁的使用方法相关的知识,希望对你有一定的参考价值。

同一时刻,只能有一个线程持有该锁!

使用Mutex互斥锁来同步两个单独的程序(可以两次运行该程序,查看运行结果)

     static void Main(string[] args)
        {
            const string MutexName = "CSharpThreadingCookbook";

            using (var m = new Mutex(false, MutexName))
            {
                //WaitOne构造表示指定的时间内(这里是5秒)是否可以获得互斥锁定
                if (!m.WaitOne(TimeSpan.FromSeconds(5), false))
                {
                    //如果当前实例5秒内不能获取到互斥锁(由于其他线程占用锁【第一次运行的程序未回车】,则此不能获取到互斥锁定,所以代码运行这里)
                    Console.WriteLine("Second instance is running!");
                    Console.Read();
                }
                else//获取到互斥锁
                {
                    ////如果当前实例5稍内收到了信号(如果5秒内获得了互斥锁定)【**********第一次运行可以直接进入到这里********】
                    Console.WriteLine("Running!");//在这里执行同步代码
                    Console.ReadLine();//等待输入,或者回车(如果不回车,持续占用互斥锁)
                    m.ReleaseMutex();
                }
            }
        }

 

使用Mutex互斥锁禁止程序启动两次

     [STAThread]
        static void Main()
        {
            bool createNew;
            using (System.Threading.Mutex mutex = new System.Threading.Mutex(true, Application.ProductName, out createNew))
            {
                if (createNew)//如果指定的命名系统互斥体不存在(说明没有程序运行过)
                {
                    Application.Run(new Form1());
                }
                else
                {
                    MessageBox.Show("应用程序已经在运行中...");
                    System.Threading.Thread.Sleep(1000);
                    System.Environment.Exit(1);
                }
            }
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }

 

具名的互斥量 是全局的操作系统对象! 请务必正确关闭互斥量。最好使用using代码块包裹互斥量对象。

以上是关于Mutex互斥锁的使用方法的主要内容,如果未能解决你的问题,请参考以下文章

多线程的互斥锁的运用

golang sync.Mutex互斥锁的实现原理

golang sync.Mutex互斥锁的实现原理

C++封装互斥锁和基于RAII机制能自动解锁的互斥锁

信号量与互斥锁的区别

线程同步方式之互斥量Mutex