C# Mutex对象怎么使用
发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,本篇内容主要讲解"C# Mutex对象怎么使用",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C# Mutex对象怎么使用"吧!如何控制好多个线程相互之间的
千家信息网最后更新 2025年01月19日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安全错误
数据库的锁怎样保障安全
肖战宣传网络安全
简易数据库视频
网络技术人员招聘掌握什么
深圳金牛互联网科技
网络技术对我们生活的
4G网络安全知识
网络技术专业主要的工作
原神小米是哪个服务器
广东数据软件开发设施应用
广西互联网软件开发方案
办公楼网络安全建设需求
日本 数据库 研究生
上海软件开发专业的专科
音乐服务器怎么搭建
inria数据库
t3数据库置疑工具
广东广电网络安全吗
ios 模型软件开发
南京网络技术有限公司怎么样
华为数据库分页
文件从客户机转移到服务器
为什么无法连接数据库呢
wps同一列出现相同数据库
cobol软件开发吧
吉林省创益网络技术有限公司
郑州哪个职校教软件开发较好
喵喵数据库
服务器管理助手架设多站点
广东广电网络安全吗
lol黑色服务器在哪