一.Mutex類
MSDN簡單描述:
當兩個或更多線程需要同時訪問一個共享資源時,系 統需要使用同步機制來確保 一次只有一個線程使用該資源。Mutex 是同步基元,它只向一個線程授予對共享資源的獨占訪問權。如果一個線程獲取了互斥體,則要獲取該互斥體的第二個線程將被掛起,直到第一個線程釋放該互斥 體。
可以使用 WaitHandle.WaitOne 方法請求互斥體的所屬權。擁有互斥體的線程可以在對 WaitOne 的重復調用中請求相同的互斥體而不會阻止其執行。但線程必須調用 ReleaseMutex 方法同樣多的次數以釋放互斥體的所屬權。Mutex 類強制線程標識,因此互斥體只能由獲得它的線程釋放。相反,Semaphore 類不強制線程標識。
互斥體有兩種類型:局部互斥體和已命名的系統互斥體。如果使用接受名稱的構 造函數創建 Mutex 對象,則該對象與具有該名稱的操作系統對象關聯。已命名的系統互斥體在整個操作系統中都可見,可用於同步進程活動。您可以創建多個 Mutex 對象來表示同一個已命名的系統互斥體,也可以使用 OpenExisting 方法打開現有的已命名系統互斥 體。
局部互斥體僅存在於您的 進程內。您的進程中任何引用局部 Mutex 對象的線程都可以使用它。每個 Mutex 對象都是一個單獨的局部互斥體。
個人對互斥對象(Mutex)的理解:
1. 做不到兩個線程交互執行的目的。如果把Mutex對象放在了兩個線程的循環裡,當線程執行出了臨界區,兩個線程都會馬上去搶互斥對象,所以可能一個線程的循環裡可能會多次執行!
例:
For(int i=0;i<count;i++)
{
Mutex.WaitOne();
……….
Mutex.releaseMutex();
}在一個線程中這個循環可能執行多次
2.它的一個最大的用處就是上面我標黃的文字所述,可以防止一個程序創建多個進程。
二、Monitor類(或Lock鎖)
MSDN簡單描述:
Monitor 類通過向單個線程授予對象鎖來控制對對象的訪問。對象鎖提供限制訪問代碼塊(通常稱為臨界區)的能力。當一個線程擁有對象的鎖時,其他任何線程都不能獲取 該鎖。還可以使用 Monitor 來確保不會允許其他任何線程訪問正在由鎖的所有者執行的應用程序代碼節,除非另一個線程正在使用其他的鎖定對象執行該代碼。
Monitor 具有以下功能:
將為每個同步對象來維護以下信息:
下表描述了訪問同步對象的線程可以采取的操作:
操作
說明
Enter, TryEnter
獲 取對象鎖。此操作同樣會標記臨界區的開頭。其他任何線程都不能進入臨界區,除非它使用其他鎖定對象執行臨界區中的指令。
Wait
釋 放對象上的鎖以便允許其他線程鎖定和訪問該對象。在其他線程訪問對象時,調用線程將等待。脈沖信號用於通知等待線程有關對象狀態的更改。
Pulse (信號), PulseAll
向 一個或多個等待線程發送信號。該信號通知等待線程鎖定對象的狀態已更改,並且鎖的所有者准備釋放該鎖。等待線程被放置在對象的就緒隊列中以便它可以最後接 收對象鎖。一旦線程擁有了鎖,它就可以檢查對象的新狀態以查看是否達到所需狀態。
Exit
釋 放對象上的鎖。此操作還標記受鎖定對象保護的臨界區的結尾。
使用 Enter 和 Exit 方法標記臨界區的開頭和結尾。如果臨界區是一個連續指令集,則由 Enter 方法獲取的鎖將保證只有一個線程可以使用鎖定對象執行所包含的代碼。
個人對Monitor類的理解:
1.實看MSDN的描述似乎Monitor類和Mutex類的功能差不多,都是鎖定臨界區來到達多線程同步,其實,如果只用Monitor類的Enter和Exit方法的話也會出現用Mutex類鎖定臨界區的情況,即在出了臨界區,每個線程(包括剛釋放鎖的線程)都會去搶這個鎖。但是因為有了Monitor類的Wait方法和Pluse方法才可以讓兩個線程到達互斥訪問臨界區的目的,即每個線程訪問交互的訪問自己的線程上下文(這樣說好些?說自己的代碼區是否也可以?),但是這兩個方法必須放在用Lock或Monitor(用Enter和Exit方法)鎖定的臨界區內!