千家信息网

C# Mutex对象怎么使用

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容主要讲解"C# Mutex对象怎么使用",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C# Mutex对象怎么使用"吧!如何控制好多个线程相互之间的
千家信息网最后更新 2026年11月02日C# Mutex对象怎么使用

本篇内容主要讲解"C# Mutex对象怎么使用",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C# Mutex对象怎么使用"吧!

如何控制好多个线程相互之间的联系,不产生冲突和重复,这需要用到互斥对象,即:System.Threading 命名空间中的 Mutex 类。

我们可以把Mutex看作一个出租车,乘客看作线程。乘客首先等车,然后上车,***下车。当一个乘客在车上时,其他乘客就只有等他下车以后才可以上车。而线程与C# Mutex对象的关系也正是如此,线程使用Mutex.WaitOne()方法等待C# Mutex对象被释放,如果它等待的C# Mutex对象被释放了,它就自动拥有这个对象,直到它调用Mutex.ReleaseMutex()方法释放这个对象,而在此期间,其他想要获取这个C# Mutex对象的线程都只有等待。

下面这个例子使用了C# Mutex对象来同步四个线程,主线程等待四个线程的结束,而这四个线程的运行又是与两个C# Mutex对象相关联的。

其中还用到AutoResetEvent类的对象,可以把它理解为一个信号灯。这里用它的有信号状态来表示一个线程的结束。

using System;  using System.Threading;   namespace ThreadExample  {  public class MutexSample  {  static Mutex gM1;  static Mutex gM2;  const int ITERS = 100;  static AutoResetEvent Event1 = new AutoResetEvent(false);  static AutoResetEvent Event2 = new AutoResetEvent(false);  static AutoResetEvent Event3 = new AutoResetEvent(false);  static AutoResetEvent Event4 = new AutoResetEvent(false);   public static void Main(String[] args)  {  Console.WriteLine("Mutex Sample ");  //创建一个Mutex对象,并且命名为MyMutex  gM1 = new Mutex(true,"MyMutex");  //创建一个未命名的Mutex 对象.  gM2 = new Mutex(true);  Console.WriteLine(" - Main Owns gM1 and gM2");   AutoResetEvent[] evs = new AutoResetEvent[4];  evs[0] = Event1; //为后面的线程t1,t2,t3,t4定义AutoResetEvent对象  evs[1] = Event2;   evs[2] = Event3;   evs[3] = Event4;    MutexSample tm = new MutexSample( );  Thread t1 = new Thread(new ThreadStart(tm.t1Start));  Thread t2 = new Thread(new ThreadStart(tm.t2Start));  Thread t3 = new Thread(new ThreadStart(tm.t3Start));  Thread t4 = new Thread(new ThreadStart(tm.t4Start));  t1.Start( );// 使用Mutex.WaitAll()方法等待一个Mutex数组中的对象全部被释放  t2.Start( );// 使用Mutex.WaitOne()方法等待gM1的释放  t3.Start( );// 使用Mutex.WaitAny()方法等待一个Mutex数组中任意一个对象被释放  t4.Start( );// 使用Mutex.WaitOne()方法等待gM2的释放   Thread.Sleep(2000);  Console.WriteLine(" - Main releases gM1");  gM1.ReleaseMutex( ); //线程t2,t3结束条件满足   Thread.Sleep(1000);  Console.WriteLine(" - Main releases gM2");  gM2.ReleaseMutex( ); //线程t1,t4结束条件满足   //等待所有四个线程结束  WaitHandle.WaitAll(evs);   Console.WriteLine(" Mutex Sample");  Console.ReadLine();  }   public void t1Start( )  {  Console.WriteLine("t1Start started, Mutex.WaitAll(Mutex[])");  Mutex[] gMs = new Mutex[2];  gMs[0] = gM1;//创建一个Mutex数组作为Mutex.WaitAll()方法的参数  gMs[1] = gM2;  Mutex.WaitAll(gMs);//等待gM1和gM2都被释放  Thread.Sleep(2000);  Console.WriteLine("t1Start finished, Mutex.WaitAll(Mutex[]) satisfied");  Event1.Set( ); //线程结束,将Event1设置为有信号状态  }  public void t2Start( )  {  Console.WriteLine("t2Start started, gM1.WaitOne( )");  gM1.WaitOne( );//等待gM1的释放  Console.WriteLine("t2Start finished, gM1.WaitOne( ) satisfied");  Event2.Set( );//线程结束,将Event2设置为有信号状态  }  public void t3Start( )  {  Console.WriteLine("t3Start started, Mutex.WaitAny(Mutex[])");  Mutex[] gMs = new Mutex[2];  gMs[0] = gM1;//创建一个Mutex数组作为Mutex.WaitAny()方法的参数  gMs[1] = gM2;  Mutex.WaitAny(gMs);//等待数组中任意一个Mutex对象被释放  Console.WriteLine("t3Start finished, Mutex.WaitAny(Mutex[])");  Event3.Set( );//线程结束,将Event3设置为有信号状态  }  public void t4Start( )  {  Console.WriteLine("t4Start started, gM2.WaitOne( )");  gM2.WaitOne( );//等待gM2被释放  Console.WriteLine("t4Start finished, gM2.WaitOne( )");  Event4.Set( );//线程结束,将Event4设置为有信号状态  }  }  }

到此,相信大家对"C# Mutex对象怎么使用"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

对象 线程 C# 方法 信号 数组 状态 乘客 内容 参数 只有 条件 学习 实用 更深 相互之间 两个 之间 例子 信号灯 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 青岛互联网科技公司 互联网科技公司电话 易通互联网络科技有限公司 互联网金融科技委员会 互联网金融监管科技 深圳卡尔迅互联网科技有限公司怎么样 蓝色互联网科技 卫星互联网科技股票 农村开互联网科技讲堂 福州新华互联网科技学校 知乎 厦门千工互联网科技有限公司 互联网第三次科技革命特征 深圳无忧互联网科技 广州富喜互联网络科技 富国互联网科技002692 从那以后互联网科技有限公司 互联网科技融合创新 陕西云淼互联网科技公司 美国五大互联网科技公司市值多少 互联网科技品牌 互联网科技园 互联网金融科技平台 新华互联网科技校企合作 乌苏新华互联网科技做什么的 徐州市互联网科技有限公司 恒生互联网科技业指数调整周期 美国互联网科技实力 每天都有哪些好的互联网科技 上海钢联属于互联网科技股吗 互联网科技企业文化
0