Mutex 互斥體核心特性
- 跨進程同步:命名 Mutex 可跨越應用程式域/進程邊界,實現多進程互斥。
- 核心物件:屬核心模式同步物件,效能較 Monitor/lock 低,但功能更強。
- 擁有權:具有線程擁有權概念,只有擁有者能釋放(
ReleaseMutex)。
- 放棄處理:擁有者異常終止未釋放時,下一個等待者會收到
AbandonedMutexException 並獲得擁有權。
關鍵建構子與方法
| 成員 | 說明 |
Mutex() | 建立未命名區域互斥體 |
Mutex(bool initiallyOwned, string name) | 建立命名互斥體,可指定初始擁有權 |
WaitOne() | 阻塞等待取得擁有權 |
WaitOne(TimeSpan) | 帶超時等待 |
ReleaseMutex() | 釋放擁有權 |
Mutex.OpenExisting(name) | 開啟現有命名互斥體 |
單機單一實例應用(經典用法)
using System;
using System.Threading;
using System.Windows.Forms;
static class Program
{
[STAThread]
static void Main()
{
bool createdNew;
using (Mutex mutex = new Mutex(true, "MyAppSingleInstance", out createdNew))
{
if (!createdNew)
{
MessageBox.Show("程式已在執行中!");
return;
}
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
}
}
跨進程資料保護範例
// 進程 A:寫入共享資料
using (Mutex m = new Mutex(false, "Global\\SharedDataMutex"))
{
m.WaitOne();
try { /* 寫入共享記憶體/檔案 */ }
finally { m.ReleaseMutex(); }
}
// 進程 B:讀取共享資料
using (Mutex m = Mutex.OpenExisting("Global\\SharedDataMutex"))
{
m.WaitOne();
try { /* 讀取共享記憶體/檔案 */ }
finally { m.ReleaseMutex(); }
}
放棄互斥體處理
try
{
mutex.WaitOne();
// 臨界區
}
catch (AbandonedMutexException)
{
// 前擁有者異常結束,資料可能損毀,需驗證/修復
// 當前線程已獲得擁有權,可繼續處理
}
finally
{
if (/* 當前線程擁有 */) mutex.ReleaseMutex();
}
Mutex vs lock/Monitor 比較
| 特性 | Mutex | lock/Monitor |
| 跨進程 | 支援(命名) | 不支援 |
| 效能 | 較低(核心轉換) | 極高(用戶模式) |
| 擁有權檢查 | 嚴格(只能擁有者釋放) | 無(任何線程可 Exit) |
| 放棄處理 | 自動偵測拋出異常 | 無機制 |
| 適用場景 | 跨進程、單一實例、系統級資源 | 進程內高頻同步 |
圖示說明
(原文包含四張圖片,展示 Mutex 運作流程、命名互斥體跨進程示意、單一實例程式碼、放棄處理流程)