Csharp/C Sharp/Thread/Monitor
Monitor: Enter
<source lang="csharp"> using System; using System.Threading;
public class EnterExit {
private int result = 0; public void NonCriticalSection() { Console.WriteLine("Entered Thread " + Thread.CurrentThread.GetHashCode()); for (int i = 1; i <= 5; i++) { Console.WriteLine("Result = " + result++ + " ThreadID " + Thread.CurrentThread.GetHashCode()); Thread.Sleep(1000); } Console.WriteLine("Exiting Thread " + Thread.CurrentThread.GetHashCode()); } public void CriticalSection() { Monitor.Enter(this); Console.WriteLine("Entered Thread " + Thread.CurrentThread.GetHashCode()); for (int i = 1; i <= 5; i++) { Console.WriteLine("Result = " + result++ + " ThreadID " + Thread.CurrentThread.GetHashCode()); Thread.Sleep(1000); } Console.WriteLine("Exiting Thread " + Thread.CurrentThread.GetHashCode()); Monitor.Exit(this); } public static void Main(String[] args) { EnterExit e = new EnterExit(); Thread nt1 = new Thread(new ThreadStart(e.NonCriticalSection)); nt1.Start(); Thread nt2 = new Thread(new ThreadStart(e.NonCriticalSection)); nt2.Start(); Thread ct1 = new Thread(new ThreadStart(e.CriticalSection)); ct1.Start(); Thread ct2 = new Thread(new ThreadStart(e.CriticalSection)); ct2.Start(); }
}
</source>
Monitor.Pulse
<source lang="csharp"> using System; using System.Threading; class MessageBoard {
private String messages = "no messages"; public void Reader() { try { Monitor.Enter(this); if (messages == "no messages") { Console.WriteLine("{0} {1}",Thread.CurrentThread.Name, messages); Console.WriteLine("{0} waiting",Thread.CurrentThread.Name); Monitor.Wait(this); } Console.WriteLine("{0} {1}",Thread.CurrentThread.Name, messages); } finally { Monitor.Exit(this); } } public void Writer() { try { Monitor.Enter(this); messages = "Greetings!"; Console.WriteLine("{0} Done writing message",Thread.CurrentThread.Name); Monitor.Pulse(this); } finally { Monitor.Exit(this); } } public static void Main() { MessageBoard myMessageBoard = new MessageBoard(); Thread reader = new Thread(new ThreadStart(myMessageBoard.Reader)); reader.Name = "ReaderThread:"; Thread writer = new Thread(new ThreadStart(myMessageBoard.Writer)); writer.Name = "WriterThread:"; reader.Start(); writer.Start(); }
}
</source>
Monitor.TryEnter
<source lang="csharp">
using System; using System.Threading; public class TryEnter {
public void CriticalSection() { bool b = Monitor.TryEnter(this, 1000); Console.WriteLine("Thread " + Thread.CurrentThread.GetHashCode() + " TryEnter Value " + b); for (int i = 1; i <= 3; i++) { Thread.Sleep(1000); Console.WriteLine(i + " " + Thread.CurrentThread.GetHashCode() + " "); } Monitor.Exit(this); } public static void Main() { TryEnter a = new TryEnter(); Thread t1 = new Thread(new ThreadStart(a.CriticalSection)); Thread t2 = new Thread(new ThreadStart(a.CriticalSection)); t1.Start(); t2.Start(); }
}
</source>