C#多线程中的互斥锁Mutex

 更新时间:2022年04月20日 09:16:37   作者:農碼一生  
这篇文章介绍了C#多线程中的互斥锁Mutex,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

一、简介

Mutex的突出特点是可以跨应用程序域边界对资源进行独占访问,即可以用于同步不同进程中的线程,这种功能当然这是以牺牲更多的系统资源为代价的。

主要常用的两个方法:

  • public virtual bool WaitOne() 阻止当前线程,直到当前 System.Threading.WaitHandle 收到信号获取互斥锁。
  • public void ReleaseMutex() 释放 System.Threading.Mutex 一次。

二、代码

案例一:

    class Program
    {
        private static Mutex mutex = new Mutex();
        static void Main(string[] args)
        {
            Thread[] thread = new Thread[3];
            for (int i = 0; i < 3; i++)
            {
                thread[i] = new Thread(ThreadMethod1);//方法引用
                thread[i].Name = "Thread-" + (i+1).ToString();
            }
            for (int i = 0; i < 3; i++)
            {
                thread[i].Start();
            }
            Console.ReadKey();
        }
        public static void ThreadMethod1(object val)
        {           
            mutex.WaitOne();    //获取锁
            for (int i = 1; i <=5; i++)
            {
                Console.WriteLine("{0}循環了{1}次", Thread.CurrentThread.Name, i);
            }
            mutex.ReleaseMutex();  //释放锁
        }
    }

运行结果:

案例二:

    class Program
    {
        private static Mutex mutex = new Mutex();
        private static int sum = 0;
        static void Main(string[] args)
        {
            Task<int> task = new Task<int>(ThreadFunction);
            task.Start();
            Console.WriteLine($"{DateTime.Now} task started!");
            Thread.Sleep(2000);//Main主線程

            Console.WriteLine($"{DateTime.Now} Get siginal in Main!");
            mutex.WaitOne();
            Console.WriteLine($"{DateTime.Now} Get siginal in main!");

            Console.WriteLine($"{DateTime.Now} Result is {task.Result}");
            Console.ReadKey();
        }
        private static int ThreadFunction()
        {
            Console.WriteLine($"{DateTime.Now} Get siginal in ThreadFunction!");
            mutex.WaitOne();  //获取锁
            for (int i = 0; i <= 10; i++)
            {
                sum += i;
                Thread.Sleep(1000);
            }
            Console.WriteLine($"{DateTime.Now} Release mutex in ThreadFunction!");
            mutex.ReleaseMutex();  //释放锁

            return sum;
        }
    }

运行结果:

三、总结

为避免发送多线程发生死锁,Mutex的WaitOne()和ReleaseMutex()需成对配合使用。

到此这篇关于C#互斥锁Mutex的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C# 多进程打开PPT的示例教程

    C# 多进程打开PPT的示例教程

    这篇文章主要介绍了C# 多进程打开PPT的示例教程,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2021-01-01
  • C#判断一个字符串是否包含另一个字符串的方法

    C#判断一个字符串是否包含另一个字符串的方法

    这篇文章主要介绍了C#判断一个字符串是否包含另一个字符串的方法,涉及C#中IndexOf方法的使用技巧,非常简单实用,需要的朋友可以参考下
    2015-04-04
  • WPF实现图片合成或加水印的方法【2种方法】

    WPF实现图片合成或加水印的方法【2种方法】

    这篇文章主要介绍了WPF实现图片合成或加水印的方法,结合实例形式分析了2种比较实用的WPF图片操作相关技巧,需要的朋友可以参考下
    2017-03-03
  • C#接口实现方法实例分析

    C#接口实现方法实例分析

    这篇文章主要介绍了C#接口实现方法,以实例形式较为详细的分析了C#接口的功能、定义及实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • 浅谈c#中config.exe 引发的一些问题

    浅谈c#中config.exe 引发的一些问题

    下面小编就为大家分享一篇浅谈c#中config.exe 引发的一些问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-11-11
  • C# 静态构造函数使用总结

    C# 静态构造函数使用总结

    今天花了一些时间把静态构造函数的用法总结了一下,希望高手们指点。谢谢
    2013-03-03
  • c#各种Timer类的区别与用法介绍

    c#各种Timer类的区别与用法介绍

    System.Threading.Timer 是一个简单的轻量计时器,它使用回调方法并由线程池线程提供服务。在必须更新用户界面的情况下,建议不要使用该计时器,因为它的回调不在用户界面线程上发生
    2013-10-10
  • 关于C#基础知识回顾--反射(三)

    关于C#基础知识回顾--反射(三)

    在前面例子中,由于MyClass类型的对象是显示创建的,因此使用反射技术来调用MyClass上的方法没有任何优势--以普通的方式调用对象上的方法会简单的多
    2013-07-07
  • C#实现多个计时器记录不同定时时间

    C#实现多个计时器记录不同定时时间

    这篇文章主要为大家详细介绍了C#实现多个计时器记录不同定时时间,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • unity里获取text中文字宽度并截断省略的操作

    unity里获取text中文字宽度并截断省略的操作

    这篇文章主要介绍了unity里获取text中文字宽度并截断省略的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04

最新评论