using System;
using System.Threading;
namespace MyMutexSample
{
class MutexSample
{
static Mutex mutex1;
static Mutex mutex2;
static AutoResetEvent event1 = new AutoResetEvent(false);
static AutoResetEvent event2 = new AutoResetEvent(false);
static AutoResetEvent event3 = new AutoResetEvent(false);
static AutoResetEvent event4 = new AutoResetEvent(false);
static void Main(string[] args)
{
Console.WriteLine("Mutex Sample....");
mutex1 = new Mutex(true, "MyMutex1");
mutex2 = new Mutex(true);
Console.WriteLine("Main owns mutex1 and multex2");
AutoResetEvent[] events = new AutoResetEvent[4];
events[0] = event1;
events[1] = event2;
events[2] = event3;
events[3] = event4;
MutexSample mutexSample = new MutexSample();
Thread thread1 = new Thread(new ThreadStart(mutexSample.Method1));
Thread thread2 = new Thread(new ThreadStart(mutexSample.Method2));
Thread thread3 = new Thread(new ThreadStart(mutexSample.Method3));
Thread thread4 = new Thread(new ThreadStart(mutexSample.Method4));
thread1.Start();
thread2.Start();
thread3.Start();
thread4.Start();
Thread.Sleep(2000);
Console.WriteLine("Main release mutex1");
mutex1.ReleaseMutex();
Thread.Sleep(1000);
Console.WriteLine("Main release mutex2");
mutex2.ReleaseMutex();
WaitHandle.WaitAll(events);
Console.WriteLine("...Mutex sample completed executing.");
Console.ReadKey();
}
public void Method1()
{
Console.WriteLine("Method1() started, Mutex.WaitAll(Mutex[])");
Mutex[] mutexes = new Mutex[2];
mutexes[0] = mutex1;
mutexes[1] = mutex2;
Mutex.WaitAll(mutexes);
Thread.Sleep(2000);
Console.WriteLine("Method1() finished, Mutex.WaitAll(Mutex[]) satisfied");
mutexes[0].ReleaseMutex();
mutexes[1].ReleaseMutex();
event1.Set();
}
public void Method2()
{
Console.WriteLine("Method2() started, mutex1.WaitOne()");
mutex1.WaitOne();
Thread.Sleep(2000);
Console.WriteLine("Method2() finished, mutex1.WaitOne() satisfied");
mutex1.ReleaseMutex();
event2.Set();
}
public void Method3()
{
Console.WriteLine("Method3() started, Mutex.WaitAny(Mutex[])");
Mutex[] mutexes = new Mutex[2];
mutexes[0] = mutex1;
mutexes[1] = mutex2;
Mutex.WaitAny(mutexes);
Thread.Sleep(2000);
Console.WriteLine("Method3() finished, Mutex.WaitAny(Mutex[]) satisfied");
mutexes[0].ReleaseMutex();
event3.Set();
}
public void Method4()
{
Console.WriteLine("Method4() started, mutex2.WaitOne()");
mutex2.WaitOne();
Thread.Sleep(2000);
Console.WriteLine("Method4() finished, mutex2.WaitOne() satisfied");
mutex2.ReleaseMutex();
event4.Set();
}
}
}