• c# 多线程同步之Mutex


         说起Mutex,它的中文名字叫互斥体。它是WaitHandle家族成员之一,前面有一篇介绍过WaitHandle的家族成员构成。那么Mutex有什么作用呢?它是怎么使用的?

         我们先来看看它的使用场景一:

         话说小王同学做了wpf的客户端程序,现在已经打包好了,准备发布出去,结果在本地测试时,突然发现他的程序可以打开多个登录窗口,于是慌了。这可如何是好,他和同事一起在网上搜索相关资料,查询如何保证程序每次只打开一个进程。详见代码:

     1   static System.Threading.Mutex mutex = null;   
     2    protected override void OnStartup(StartupEventArgs e)
     3         {
     4             bool canCreate= false;
     5             mutex = new System.Threading.Mutex(true, "Sharey", out canCreate);
     6             if (canCreate)
     7             {
     8                 RegisterEvents();
     9                 base.OnStartup(e);
    10             }
    11             else
    12             {
    13                 Environment.Exit(1);
    14             }
    15         }

          分析下代码,程序中第5行,创建了Mutex 对象,其实这个对象由操作系统管理,它的拥有权,属于当前调用的线程,而且还起了一个名字,这个名字是唯一的,不能重复。当另外一个线程也打算创建相同名称的Mutex 对象时,就会返回false,此时程序中的canCreate为false,那么就直接退出当前应用程序,这样利用互斥对象,就确保了操作系统中,同时只能拥有一个进程在运行,这是不同进程中的线程同步问题

         我们再来看看它的使用场景二:

         如今的时代,以瘦为美,所以美女们对自己的体重很关心,每次经过药店门口时,都会有人称体重,旁边还会站有1-2个人在等待。显然这个免费的称体重的称是个稀缺资源,不可多得呀,这个巷子就只有这么一台。回到我们程序的世界,不过是借鉴了现实世界中的很多解决问题的思路而已。看代码:

         

     1         static Mutex mt = new Mutex();
     2         static int peopleCount = 3;
     3         static void Main(string[] args)
     4         {
     5             for (var i = 0; i < peopleCount; i++)
     6             {
     7                 var t = new Thread(Weigh);
     8                 t.Name = (i + 1).ToString();
     9                 t.Start();
    10             }
    11 
    12             Console.Read();
    13         }
    14 
    15         static void Weigh()
    16         {
    17             mt.WaitOne();
    18             Console.WriteLine(String.Format("{0}-People{1}上称", DateTime.Now.ToString(), Thread.CurrentThread.Name));
    19             Thread.Sleep(1000);
    20             Console.WriteLine(String.Format("{0}-People{1}下称", DateTime.Now.ToString(), Thread.CurrentThread.Name));
    21             mt.ReleaseMutex();
    22         }

    运行结果如下:

    17行,Waitone,就是等待,如果称上没人,就上去了,显然此时形同给称加了把锁,21行, 执行了ReleaseMutex,释放了这个锁,其它人就可以上去了。现实生活中的例子很多,比如一台ATM,同时只允许一个人操作,等操作完了,其他人再操作。

  • 相关阅读:
    关键字--super
    JSP学习笔记3--指令元素
    JSP学习笔记2--JSP基本元素
    力扣233.数字1出现的次数
    JSP学习笔记1
    继承
    Cocos2dx-Lua中Sprite精灵的3种创建方法
    cocos2dx Action动作 (3)CCSkewTo、CCSkewBy
    cocos2dx Action动作解析(2)
    cocos2dx Action动作解析(1)
  • 原文地址:https://www.cnblogs.com/wangqiang3311/p/6877387.html
Copyright © 2020-2023  润新知