zoukankan      html  css  js  c++  java
  • Mutex

    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()需成对配合使用。


    技术的发展日新月异,随着时间推移,无法保证本博客所有内容的正确性。如有误导,请大家见谅,欢迎评论区指正!
    我创建了一个.NET开发交流群,用于分享学习心得和讨论相关技术难题。欢迎有兴趣的小伙伴扫码入群,相互学习!

  • 相关阅读:
    如何在 Linux 中更改 swappiness
    logrotate机制&原理
    Linux命令 – ln 软连接与硬链接区别介绍
    Python实现目录文件的全量和增量备份
    tr -d命令删除与字符无关的符号
    CentOS7搭建时间服务器-chrony
    linux(centos7.0以上版本)安装 mysql-5.7.24-linux-glibc2.12-x86_64.tar 版本的mysql
    运维相关指标数据采集并ES入仓
    Kubernetes容器集群管理环境
    C++调用IDL程序的做法(三)
  • 原文地址:https://www.cnblogs.com/wml-it/p/14822648.html
Copyright © 2011-2022 走看看