Object monitor plays a leading role in thread synchronization. Apart from its Enter and Exit methods (equivalent to opening and closing bracket pairafter the lock keywordspecifying synchronized codeblock), it offers two additional methods which are required to augment its synchronization functionality.
According to the documentation, Enter and Exit methods enclose a critical region, in which the object monitored is ensured of being accessed mutually exclusively by different threads.
A thread can relinquish the monitored object it owns by calling Monitor.Wait method, and all the other threads waiting on the object contend for it. DotNet thread mechanism requires the thread releasing the object should call Monitor.Pulse or Monitor.PulseAll to notify all waiting threadsthat the monitored object's status has beenupdatedbefore calling the Monitor.Wait. Therefore, as for the code below, the Monitor.Pulse method call right before end of the the locksectionis indespensible lest the blocked thread not be woken up.
using System; namespace ConsoleTest { class ThreadingTest { void DoCriticalJobs() { lock(this) { for (int i = 0; i < 10; i++) { Console.WriteLine("CriticalJob {0} on thread {1}", i, System.Threading.Thread.CurrentThread.ManagedThreadId); if (i == 4) { System.Threading.Monitor.Pulse(this); System.Threading.Monitor.Wait(this); } } System.Threading.Monitor.Pulse(this); /* this line is essential */ } } void ThreadEntry(object obj) { DoCriticalJobs(); } public void Test() { System.Threading.Thread thread1 = new System.Threading.Thread( new System.Threading.ParameterizedThreadStart(this.ThreadEntry)); System.Threading.Thread thread2 = new System.Threading.Thread( new System.Threading.ParameterizedThreadStart(this.ThreadEntry)); thread1.Priority = System.Threading.ThreadPriority.Normal; thread2.Priority = System.Threading.ThreadPriority.Normal; thread1.Start(); thread2.Start(); thread1.Join(); thread2.Join(); } } }
本文探讨了对象监视器(Object Monitor)在.NET线程机制中的作用,特别是其Enter和Exit方法如何确保不同线程之间的互斥访问。此外,还讨论了Monitor.Wait和Monitor.Pulse方法在同步上下文中的使用,并通过示例代码展示了这些方法如何协同工作以实现线程间的正确同步。
3397

被折叠的 条评论
为什么被折叠?



