首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

多線程入門系列(九):Mutex 互斥體跨進程同步

     編輯:關於C#

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 比較

特性Mutexlock/Monitor
跨進程支援(命名)不支援
效能較低(核心轉換)極高(用戶模式)
擁有權檢查嚴格(只能擁有者釋放)無(任何線程可 Exit)
放棄處理自動偵測拋出異常無機制
適用場景跨進程、單一實例、系統級資源進程內高頻同步

圖示說明

(原文包含四張圖片,展示 Mutex 運作流程、命名互斥體跨進程示意、單一實例程式碼、放棄處理流程)

Mutex 基本架構 命名 Mutex 跨進程 單一實例應用程式碼 放棄互斥體處理流程
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved