C# Mutex實現(xiàn)線程與進程同步的技術指南
1、簡述
在多線程或多進程程序中,如果多個線程/程序同時訪問同一資源(文件、數(shù)據(jù)庫、端口、共享內存),很容易導致數(shù)據(jù)沖突或程序異常。為了解決這種“并發(fā)訪問沖突”,C# 提供了強大的同步原語 —— Mutex(互斥量)。
本文將深入講解:
- 什么是 Mutex
- Mutex 的常見應用場景
- 本地線程級鎖與跨進程鎖的區(qū)別
- 實戰(zhàn)樣例(單實例程序、防止重復寫文件、多線程同步)

2、什么是 Mutex?
Mutex(Mutual Exclusion)互斥量 是一種同步機制,用于確保同一時間只有一個線程或進程能夠訪問特定資源。
關鍵特征:
- Mutex 可以跨線程同步,也可以跨進程同步;
- 與
lock語句不同,Mutex可以命名; - 可以通過名稱在不同程序間共享。
3、實踐樣例
3.1 基本使用方法
using System;
using System.Threading;
class Program
{
static void Main()
{
using (var mutex = new Mutex())
{
mutex.WaitOne(); // 請求進入臨界區(qū)
Console.WriteLine("線程進入臨界區(qū)...");
Thread.Sleep(2000); // 模擬工作
Console.WriteLine("線程退出臨界區(qū)。");
mutex.ReleaseMutex(); // 釋放鎖
}
}
}
輸出:
線程進入臨界區(qū)...
線程退出臨界區(qū)。
當多個線程運行這段代碼時,會 排隊等待 獲取鎖,避免同時訪問資源。
3.2 跨進程 Mutex(命名互斥量)
通過為 Mutex 指定名稱(例如 "Global\\MyAppMutex"),可以實現(xiàn)跨進程級的鎖機制。即使是兩個不同的程序實例,也可以共享同一把互斥鎖。
using System;
using System.Threading;
class Program
{
static Mutex? _mutex;
static void Main()
{
bool createdNew;
// 命名 Mutex,可被不同進程共享
_mutex = new Mutex(true, "Global\\MyUniqueAppName", out createdNew);
if (!createdNew)
{
Console.WriteLine("程序已在運行,請勿重復啟動!");
return;
}
Console.WriteLine("程序運行中,按任意鍵退出...");
Console.ReadKey();
_mutex.ReleaseMutex();
}
}
運行兩次該程序:
程序已在運行,請勿重復啟動!
這樣可以防止用戶誤啟動多個實例。
3.3 多線程寫文件保護
多個線程同時寫文件時,如果沒有同步,很容易導致文件被覆蓋或數(shù)據(jù)混亂。
using System;
using System.IO;
using System.Threading;
class Program
{
static readonly Mutex fileMutex = new Mutex();
static void Main()
{
for (int i = 0; i < 5; i++)
{
int threadId = i;
new Thread(() => WriteLog(threadId)).Start();
}
}
static void WriteLog(int id)
{
fileMutex.WaitOne(); // 獲取鎖
try
{
string message = $"線程 {id} 在 {DateTime.Now} 寫入日志\n";
File.AppendAllText("log.txt", message);
Console.WriteLine($"? {message}");
Thread.Sleep(500); // 模擬寫入時間
}
finally
{
fileMutex.ReleaseMutex(); // 釋放鎖
}
}
}
輸出:
線程 0 在 2025/10/24 寫入日志
線程 1 在 2025/10/24 寫入日志
...
文件內容會有序寫入,不會出現(xiàn)錯亂或覆蓋。
3.4 跨進程文件訪問控制
兩個不同的程序(甚至是不同用戶進程)寫同一個文件時,也可以使用命名 Mutex防止沖突:
using System;
using System.IO;
using System.Threading;
class Program
{
static void Main()
{
using (var mutex = new Mutex(false, "Global\\FileWriteLock"))
{
Console.WriteLine("等待文件鎖...");
mutex.WaitOne();
try
{
File.AppendAllText("shared.txt", $"寫入時間:{DateTime.Now}\n");
Console.WriteLine("寫入完成。");
Thread.Sleep(3000);
}
finally
{
mutex.ReleaseMutex();
}
}
}
}
如果同時啟動多個實例,它們會依次寫入 shared.txt 文件,避免數(shù)據(jù)混亂。
3.5 線程安全的資源管理
你可以用 Mutex 保護一些昂貴資源(例如數(shù)據(jù)庫連接、緩存文件、串口設備):
class SharedResource
{
private readonly Mutex _mutex = new Mutex();
private int _counter = 0;
public void SafeIncrement()
{
_mutex.WaitOne();
try
{
_counter++;
Console.WriteLine($"當前計數(shù):{_counter}");
}
finally
{
_mutex.ReleaseMutex();
}
}
}
4、結語
通過本文,你已經(jīng)掌握了:
Mutex的概念與適用場景;- 單實例程序控制;
- 多線程與跨進程同步;
- 文件寫入保護與資源安全訪問。
Mutex 是 C# 同步機制中最強大的工具之一,特別適用于需要跨進程協(xié)調資源的場景(如后臺服務、日志系統(tǒng)、文件寫入、硬件訪問等)。
到此這篇關于C# Mutex實現(xiàn)線程與進程同步的技術指南的文章就介紹到這了,更多相關C# Mutex線程與進程同步內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C#在Windows窗體控件實現(xiàn)內容拖放(DragDrop)功能
這篇文章介紹了C#在Windows窗體控件實現(xiàn)內容拖放(DragDrop)的功能,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05

