这里介绍使用了C# Mutex对象来同步四个线程,主线程等待四个线程的结束,而这四个线程的运行又是与两个C# Mutex对象相关联的。
C#言语有许多值得学习的当地,这儿咱们首要介绍C# Mutex目标,包含介绍操控好多个线程相互之间的联络等方面。
怎么操控好多个线程相互之间的联络,不发生抵触和重复,这需求用到互斥目标,即:System.Threading 命名空间中的 Mutex 类。
咱们能够把Mutex看作一个出租车,乘客看作线程。乘客首要等车,然后上车,***下车。当一个乘客在车上时,其他乘客就只要等他下车今后才能够上车。而线程与C# Mutex目标的联系也正是如此,线程运用Mutex.WaitOne()办法等候C# Mutex目标被开释,假如它等候的C# Mutex目标被开释了,它就主动具有这个目标,直到它调用Mutex.ReleaseMutex()办法开释这个目标,而在此期间,其他想要获取这个C# Mutex目标的线程都只要等候。
下面这个比如运用了C# Mutex目标来同步四个线程,主线程等候四个线程的完毕,而这四个线程的运转又是与两个C# Mutex目标相关联的。
其间还用到AutoResetEvent类的目标,能够把它理解为一个信号灯。这儿用它的有信号状况来表明一个线程的完毕。
- usingSystem;
- usingSystem.Threading;
- namespaceThreadExample
- {
- publicclassMutexSample
- {
- staticMutexgM1;
- staticMutexgM2;
- constintITERS=100;
- staticAutoResetEventEvent1=newAutoResetEvent(false);
- staticAutoResetEventEvent2=newAutoResetEvent(false);
- staticAutoResetEventEvent3=newAutoResetEvent(false);
- staticAutoResetEventEvent4=newAutoResetEvent(false);
- publicstaticvoidMain(String[]args)
- {
- Console.WriteLine("MutexSample");
- //创立一个Mutex目标,而且命名为MyMutex
- gM1=newMutex(true,"MyMutex");
- //创立一个未命名的Mutex目标.
- gM2=newMutex(true);
- Console.WriteLine("-MainOwnsgM1andgM2");
- AutoResetEvent[]evs=newAutoResetEvent[4];
- evs[0]=Event1;//为后边的线程t1,t2,t3,t4界说AutoResetEvent目标
- evs[1]=Event2;
- evs[2]=Event3;
- evs[3]=Event4;
- MutexSampletm=newMutexSample();
- Threadt1=newThread(newThreadStart(tm.t1Start));
- Threadt2=newThread(newThreadStart(tm.t2Start));
- Threadt3=newThread(newThreadStart(tm.t3Start));
- Threadt4=newThread(newThreadStart(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("-MainreleasesgM1");
- gM1.ReleaseMutex();//线程t2,t3完毕条件满意
- Thread.Sleep(1000);
- Console.WriteLine("-MainreleasesgM2");
- gM2.ReleaseMutex();//线程t1,t4完毕条件满意
- //等候一切四个线程完毕
- WaitHandle.WaitAll(evs);
- Console.WriteLine("MutexSample");
- Console.ReadLine();
- }
- publicvoidt1Start()
- {
- Console.WriteLine("t1Startstarted,Mutex.WaitAll(Mutex[])");
- Mutex[]gMs=newMutex[2];
- gMs[0]=gM1;//创立一个Mutex数组作为Mutex.WaitAll()办法的参数
- gMs[1]=gM2;
- Mutex.WaitAll(gMs);//等候gM1和gM2都被开释
- Thread.Sleep(2000);
- Console.WriteLine("t1Startfinished,Mutex.WaitAll(Mutex[])satisfied");
- Event1.Set();//线程完毕,将Event1设置为有信号状况
- }
- publicvoidt2Start()
- {
- Console.WriteLine("t2Startstarted,gM1.WaitOne()");
- gM1.WaitOne();//等候gM1的开释
- Console.WriteLine("t2Startfinished,gM1.WaitOne()satisfied");
- Event2.Set();//线程完毕,将Event2设置为有信号状况
- }
- publicvoidt3Start()
- {
- Console.WriteLine("t3Startstarted,Mutex.WaitAny(Mutex[])");
- Mutex[]gMs=newMutex[2];
- gMs[0]=gM1;//创立一个Mutex数组作为Mutex.WaitAny()办法的参数
- gMs[1]=gM2;
- Mutex.WaitAny(gMs);//等候数组中恣意一个Mutex目标被开释
- Console.WriteLine("t3Startfinished,Mutex.WaitAny(Mutex[])");
- Event3.Set();//线程完毕,将Event3设置为有信号状况
- }
- publicvoidt4Start()
- {
- Console.WriteLine("t4Startstarted,gM2.WaitOne()");
- gM2.WaitOne();//等候gM2被开释
- Console.WriteLine("t4Startfinished,gM2.WaitOne()");
- Event4.Set();//线程完毕,将Event4设置为有信号状况
- }
- }
- }
【修改引荐】
- C# lock关键字叙说
- C#.Net FrameWork简介
- C# new和override简略描绘
- C#值类型和引证类型浅谈
- C#标识符简略剖析
转载请说明出处
知优网 » C# Mutex目标学习经历
知优网 » C# Mutex目标学习经历