📄 c9-07.cs
字号:
// 运用Mutex类同步线程示例
using System;
using System.Threading;
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){
// 创建两个Mutex对象,一个名叫MyMutex,一个没有名字
gM1 = new Mutex(true,"MyMutex");
gM2 = new Mutex(true);
Console.WriteLine("Main方法拥有gM1和gM2");
AutoResetEvent[] evs = new AutoResetEvent[4];
evs[0] = Event1;
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();
t2.Start();
t3.Start();
t4.Start();
Thread.Sleep(2000);
Console.WriteLine("Main方法释放了gM1");
// t2和t3线程结束
gM1.ReleaseMutex( );
Thread.Sleep(1000);
Console.WriteLine("Main方法释放了gM2");
// t1和t4线程结束
gM2.ReleaseMutex( );
// 等待4个线程都结束
WaitHandle.WaitAll(evs);
}
public void t1Start(){
Console.WriteLine("t1Start启动了");
Mutex[] gMs = new Mutex[2];
gMs[0] = gM1;
gMs[1] = gM2;
// 等待两个Mutex对象都被释放
Mutex.WaitAll(gMs);
Thread.Sleep(2000);
Console.WriteLine("t1Start结束了");
// 标记方法已经结束
Event1.Set( );
}
public void t2Start(){
Console.WriteLine("t2Start启动了");
// 等待gM1对象被释放
gM1.WaitOne( );
Console.WriteLine("t2Start结束了");
// 标记方法已经结束
Event2.Set( );
}
public void t3Start(){
Console.WriteLine("t3Start启动了");
Mutex[] gMs = new Mutex[2];
gMs[0] = gM1;
gMs[1] = gM2;
// 等待两个Mutex中任何一个被释放
Mutex.WaitAny(gMs);
Console.WriteLine("t3Start结束了");
// 标记方法已经结束
Event3.Set( );
}
public void t4Start(){
Console.WriteLine("t4Start启动了");
// 等待gM2被释放
gM2.WaitOne( );
Console.WriteLine("t4Start结束了");
// 标记方法已经结束
Event4.Set( );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -