Mutex
更新:2007 年 11 月
您可以使用 Mutex 物件來提供資源的獨佔存取權。Mutex 類別所使用的系統資源比 Monitor 類別多,但它可以跨應用程式定義域界限進行封送處理、可以搭配多個等候來使用,並且可以用來同步處理不同處理序中的執行緒。如需 Managed 同步處理機制的比較,請參閱同步處理原始物件概觀。
如需程式碼範例,請參閱 Mutex 建構函式的參考文件。
使用 Mutex
執行緒會呼叫 Mutex 的 WaitOne 方法以要求擁有權。呼叫會封鎖,直到 Mutex 可供使用為止,或直到選用的逾時間隔過去為止。如果沒有執行緒擁有 Mutex,就會收到 Mutex 狀態的信號。
執行緒經由呼叫 Mutex 的 ReleaseMutex 方法來釋放它。Mutex 具有執行緒相似性;也就是說,只有擁有 Mutex 的執行緒才能釋放該 Mutex。如果執行緒釋放了不屬於它的 Mutex,執行緒中會擲回 ApplicationException。
因為 Mutex 類別是衍生自 WaitHandle,所以您也可以呼叫 WaitHandle 的靜態 WaitAll 或 WaitAny 方法,以便同時要求 Mutex 的擁有權與其他等候處理常式。
如果有執行緒擁有 Mutex,則該執行緒可在重複的等候要求呼叫中指定同一個 Mutex,而不用封鎖其執行;然而,它必須多次釋放 Mutex,直到釋放擁有權為止。
放棄的 Mutex
如果執行緒沒有釋放 Mutex 隨即終止,則此 Mutex 就稱為放棄的 Mutex。這通常表示一個嚴重的程式設計錯誤,因為 Mutex 所保護的資源可能會以不一致的狀態遺留下來。在 .NET Framework 2.0 版中,下一個獲取 Mutex 的執行緒中會擲回 AbandonedMutexException。
注意事項: |
---|
在 .NET Framework 1.0 和 1.1 版中,放棄的 Mutex 會設為收到信號的狀態,而下一個等候的執行緒會取得擁有權。如果沒有等候的執行緒,Mutex 會維持收到信號的狀態,不會有例外狀況擲回。 |
在系統範圍 Mutex 的情況中,已放棄的 Mutex 可能表示應用程式已突然終止 (例如,透過使用 [Windows 工作管理員] 的方式)。
區域與系統 Mutex
Mutex 有兩種類型:區域 Mutex 和具名系統 Mutex。如果您使用接受名稱的建構函式 (Constructor) 建立 Mutex 物件,它便會關聯到該名稱的作業系統物件。在整個作業系統中都可以看到具名系統 Mutex,而且這種 Mutex 也可以用於同步化處理序的活動。您可以建立多個 Mutex 物件來表示同一個具名的系統 Mutex,並可使用 OpenExisting 方法開啟現有的具名系統 Mutex。
區域 Mutex 只存在於您的處理序之內。您處理序中的任何執行緒,只要有對區域 Mutex 物件的參考,均可使用區域 Mutex。每一個 Mutex 都是一個獨立的區域 Mutex。
系統 Mutex 的存取控制安全性
.NET Framework 2.0 版可讓您查詢及設定具名系統物件的 Windows 存取控制安全性。建議您從建立系統 Mutex 開始就要保護它,因為系統物件是全域性的,所以可能會被其他程式碼鎖定。
如需 Mutex 的存取控制安全性的詳細資訊,請參閱 MutexSecurity 和 MutexAccessRule 類別、MutexRights 列舉型別、Mutex 類別的 GetAccessControl、SetAccessControl 和 OpenExisting 方法,以及 Mutex(Boolean, String, Boolean%, MutexSecurity) 建構函式。