最近小编新入职了一家公司,在熟悉系统的过程中发现Mutex对象,后来小编学习了一下,本文主要是讲解何为Mutex,以及Mutex的一些用法。
概念
C#中Mutex是互斥锁,位于System.Threading 命名空间中。
记得在之前的学习过程中接触到锁这个概念,结合锁的概念,再来解释一下,互斥锁是一种互斥的同步对象,意味着同一时间有且仅有一个线程。Mutex适用于一个共享资源每次只能被一个线程访问的情况,也就是控制多个线程相互之间的联系,不产生冲突和重复。
举例说明
案例一
举一个例子,设计模式中的单例模式,记得当时做机房收费系统的时候就用的单例模式防止一个界面被实例多次,而Mutex对象能达到同样的效果,防止界面被实例化多次,起到控制线程的作用。
案例二
如果大家还是不太理解,举一个更简单的例子就是把Mutex看做一个出租车,乘客看做线程。乘客首先等车,然后上车,最后下车。当一个乘客在车上时,其他乘客就只能等他下车以后才可以上车。
Mutex对象的使用方法
Public Mutex(bool owned ,name,out flag)
其中name为互斥量的名字,也就说操作系统中只有一个命名为name的互斥量的mutex,如果一个线程得到这个name的互斥锁,其他线程就无法得到这个互斥锁了,必须等待那个线程对这个进程释放。利用一个demo来展示演示一下这个mutex对象的作用。
Demo展示
//作者:贾文静
//时间:2016年12月18日21:04:32
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace mutex1
{
class Program
{
[STAThread]
//应用程序中是单线程单元
static void Main(string[] args)
{
bool flag = false;
Mutex mutex = new Mutex(true,"Program",out flag);
if (flag)
{
Console.Write("开始");
}
else
{
Console.Write("另一个程序正在运行");
System.Threading.Thread.Sleep(5000);//线程挂起5秒钟
Environment.Exit(1);//退出程序
}
Console.ReadLine();
}
}
}
然后我把一个程序打开二次,分别运行展示效果
第一次运行
在程序一不关闭的前提下,程序二开启
如果把程序中的name改成"program1",两个运行界面,都如图一所示,所以name就是操作系统中唯一标识的内容。
总结
通过上面的Demo可以得知,Mutex是如何控制线程问题,而且通过Mutex的使用很容易就解决了窗体实例化重复的问题,相对于单例模式它是简单的方便的。关于Mutex对象还会涉及到线程的调用和释放问题,具体内容也会在后续的博客中给出具体的Demo。