1)Mutex:進程之間的同步(互斥量)。
2)lock/Monitor……:線程同步。其中lock是Monitor的簡化版本(直接生成try{Monitor.Enter(……)}finally{Monitor.Exit(……);}方法。
當然,Monitor還有Pulse方法,該方法對于鎖定同一個對象的時候,允許其它線程進入準備區,同時配合Wait方法(Wait將自己暫時退出)。某種情況下可以代替信號量(ManualResetEvent),考察以下例子(來源:http://bbs.csdn.net/topics/380095508):
class MyManualEvent{ PRivate object lockObj = new object(); private bool hasSet = false; public void Set() { lock (lockObj) //排隊準備領到開鎖的鑰匙 { hasSet = true; Monitor.PulseAll(lockObj); //通知其他排隊人先拿鑰匙開鎖 } } public void WaitOne() { lock (lockObj) //排隊準備領取開鎖的鑰匙 { while (!hasSet) { Monitor.Wait(lockObj); //等通知,這樣可以拿到鑰匙開鎖了 } } }}class Program{ static MyManualEvent myManualEvent = new MyManualEvent(); static void Main(string[] args) { ThreadPool.QueueUserWorkItem(WorkerThread, "A"); ThreadPool.QueueUserWorkItem(WorkerThread, "B"); Console.WriteLine("Press enter to signal the green light"); Console.ReadLine(); myManualEvent.Set(); ThreadPool.QueueUserWorkItem(WorkerThread, "C"); Console.ReadLine(); } static void WorkerThread(object state) { myManualEvent.WaitOne(); Console.WriteLine("Thread {0} got the green light...", state); }}
3)MethodImpl:是一個特性,在System.Runtime.CompilerServices下,等同于lock。在作用于一個類方法的時候=lock(this),作用于一個靜態方法等同于lock(typeof(某個類))。
4)SynchronizedAttribute(在System.Runtime.Remoting.Contexts命名空間下)。用于多個程序域實例化某個類,使得該類的數據和方法都可以被同步(單個程序域也可以)。
值得注意的是:WaitHandler的WaitOne方法第二個參數在這里起作用。
示例代碼:
namespace Consoleapplication1{ [Synchronization(true)] class My:ContextBoundObject { static void Main(string[] args) { My my = new My(); ThreadPool.QueueUserWorkItem(my.FuncA); ThreadPool.QueueUserWorkItem(my.FuncA); Console.ReadLine(); } AutoResetEvent myEvent = new AutoResetEvent(false); public void FuncA(object state) { Console.WriteLine("Thread id is:"+Thread.CurrentThread.ManagedThreadId); myEvent.WaitOne(2000, false); //改成true你發現會有第二個線程突然插入并執行 Console.WriteLine("======="); } }}
新聞熱點
疑難解答