.Net線程足跡(四)——互斥量(Mutex)

只有擁有互斥對象的線程才具有訪問資源的權限,由於互斥對象只有一個,因此就決定了任何情況下此共享資源都不會同時被多個線程所訪問。當前佔據資源的線程在任務處理完後應將擁有的互斥對象交出,以便其他線程在獲得後得以訪問資源。

  

可以使用 WaitHandle.WaitOne 方法請求互斥體的所屬權。擁有互斥體的線程可以在對 WaitOne 的重複調用中請求相同的互斥體而不會阻止其執行。但線程必須調用 ReleaseMutex 方法同樣多的次數以釋放互斥體的所屬權。Mutex 類強制線程標識,因此互斥體只能由獲得它的線程釋放。

 

舉個例子,我們可以把Mutex看作一個出租車,乘客看作線程。乘客首先等車,然後上車,最後下車。當一個乘客在車上時,其他乘客就只有等他下車以後纔可以上車。而線程與Mutex對象的關係也正是如此,線程使用Mutex.WaitOne()方法等待Mutex對象被釋放,如果它等待的Mutex對象被釋放了,它就自動擁有這個對象,直到它調用Mutex.ReleaseMutex()方法釋放這個對象,而在此期間,其他想要獲取這個Mutex對象的線程都只有等待。

 

WiteOne的作用是"阻塞當前線程,提供對該線程的原子操作,也就是說當一個線程遇到WiteOne的時候,如果在WiteOne裏面沒有線程在操作,則此線程進去操作.而裏面有線程的時候,所有到此的線程均需要排隊等候裏面的線程執行完畢,而控制這樣操作的結束標記就是使用ReleaseMutex 方法.

 

看下面的示例(摘自MSDN),如何使用局部 Mutex 對象來同步對受保護資源的訪問。

程序輸出:

Thread1 is leaving the protected area

Thread1 is leaving the protected area

Thread2 is leaving the protected area

Thread2 is leaving the protected area

Thread3 is leaving the protected area

Thread3 is leaving the protected area

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章