using System;
using System.Threading;
class MyCounter {
public static int count = 0;
public static Mutex MuTexLock = new Mutex();
}
class IncThread {
public Thread thrd;
public IncThread() {
thrd = new Thread(this.run);
thrd.Start();
}
void run() {
Console.WriteLine("IncThread is waiting for the mutex.");
MyCounter.MuTexLock.WaitOne();
Console.WriteLine("IncThread acquires the mutex.");
int num = 10;
do {
Thread.Sleep(50);
MyCounter.count++;
Console.WriteLine("In IncThread, MyCounter.count is " + MyCounter.count);
num--;
} while(num > 0);
Console.WriteLine("IncThread releases the mutex.");
MyCounter.MuTexLock.ReleaseMutex();
}
}
class DecThread {
public Thread thrd;
public DecThread() {
thrd = new Thread(new ThreadStart(this.run));
thrd.Start();
}
void run() {
Console.WriteLine("DecThread is waiting for the mutex.");
MyCounter.MuTexLock.WaitOne();
Console.WriteLine("DecThread acquires the mutex.");
int num = 10;
do {
Thread.Sleep(50);
MyCounter.count--;
Console.WriteLine("In DecThread, MyCounter.count is " + MyCounter.count);
num--;
} while(num > 0);
Console.WriteLine("DecThread releases the mutex.");
MyCounter.MuTexLock.ReleaseMutex();
}
}
class MainClass {
public static void Main() {
IncThread mt1 = new IncThread();
DecThread mt2 = new DecThread();
mt1.thrd.Join();
mt2.thrd.Join();
}
}
IncThread is waiting for the mutex.
IncThread acquires the mutex.
DecThread is waiting for the mutex.
In IncThread, MyCounter.count is 1
In IncThread, MyCounter.count is 2
In IncThread, MyCounter.count is 3
In IncThread, MyCounter.count is 4
In IncThread, MyCounter.count is 5
In IncThread, MyCounter.count is 6
In IncThread, MyCounter.count is 7
In IncThread, MyCounter.count is 8
In IncThread, MyCounter.count is 9
In IncThread, MyCounter.count is 10
IncThread releases the mutex.
DecThread acquires the mutex.
In DecThread, MyCounter.count is 9
In DecThread, MyCounter.count is 8
In DecThread, MyCounter.count is 7
In DecThread, MyCounter.count is 6
In DecThread, MyCounter.count is 5
In DecThread, MyCounter.count is 4
In DecThread, MyCounter.count is 3
In DecThread, MyCounter.count is 2
In DecThread, MyCounter.count is 1
In DecThread, MyCounter.count is 0
DecThread releases the mutex.