using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
class Tester
{
static long counter = 0;
//new Tester();
static void Main()
{
Thread[] myThreads = {
new Thread( new ThreadStart(Decrementer) ),
new Thread( new ThreadStart(Incrementer) )
};
int ctr = 1;
foreach (Thread myThread in myThreads)
{
myThread.IsBackground = true;
myThread.Start();
myThread.Name = "Thread" + ctr.ToString();
ctr++;
Console.WriteLine("Started thread {0}", myThread.Name);
Thread.Sleep(50);
}
foreach (Thread myThread in myThreads)
{
myThread.Join();
}
}
static void Decrementer()
{
try
{
Monitor.Enter(counter);
if (counter < 10)
{
Console.WriteLine(Thread.CurrentThread.Name);
Console.WriteLine(counter);
Monitor.Wait(counter);
}
while (counter > 0)
{
long temp = counter;
temp--;
Thread.Sleep(1);
counter = temp;
Console.WriteLine(Thread.CurrentThread.Name);
Console.WriteLine(counter);
}
}
finally
{
Monitor.Exit(counter);
}
}
static void Incrementer()
{
try
{
Monitor.Enter(counter);
while (counter < 10)
{
long temp = counter;
temp++;
Thread.Sleep(1);
counter = temp;
Console.WriteLine(Thread.CurrentThread.Name);
Console.WriteLine(counter);
}
Monitor.Pulse(counter);
}
finally
{
Monitor.Exit(counter);
}
}
}