亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C# Mutex實現(xiàn)線程與進程同步的技術指南

 更新時間:2025年11月07日 09:27:53   作者:拾荒的小海螺  
在多線程或多進程程序中,如果多個線程/程序同時訪問同一資源,很容易導致數(shù)據(jù)沖突或程序異常,為了解決這種問題,C# 提供了強大的同步原語Mutex,下面我們就來看看它的具體使用吧

1、簡述

在多線程或多進程程序中,如果多個線程/程序同時訪問同一資源(文件、數(shù)據(jù)庫、端口、共享內(nèi)存),很容易導致數(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 寫入日志
...

文件內(nèi)容會有序寫入,不會出現(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é)調(diào)資源的場景(如后臺服務、日志系統(tǒng)、文件寫入、硬件訪問等)。

到此這篇關于C# Mutex實現(xiàn)線程與進程同步的技術指南的文章就介紹到這了,更多相關C# Mutex線程與進程同步內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 基于C#實現(xiàn)rar文件密碼破解工具

    基于C#實現(xiàn)rar文件密碼破解工具

    這篇文章主要為大家詳細介紹了如何基于C#實現(xiàn)一個rar文件密碼破解工具,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-07-07
  • C#實現(xiàn)掃描槍掃描二維碼并打印(實例代碼)

    C#實現(xiàn)掃描槍掃描二維碼并打印(實例代碼)

    這篇文章主要介紹了C#實現(xiàn)掃描槍掃描二維碼并打印,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • WPF實現(xiàn)多運算符表達式計算器

    WPF實現(xiàn)多運算符表達式計算器

    這篇文章主要為大家詳細介紹了WPF實現(xiàn)多運算符表達式計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C#移除所有事件綁定的方法

    C#移除所有事件綁定的方法

    這篇文章主要介紹了C#移除所有事件綁定的方法,實例分析了C#事件綁定的移除方法,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • DataReader、DataSet、DataAdapter和DataView使用介紹

    DataReader、DataSet、DataAdapter和DataView使用介紹

    ADO.NET提供兩個對象用于檢索關系型數(shù)據(jù)并把它存儲在內(nèi)存中,分別是DataSet和DataReader,本文將詳細介紹這幾個對象的應用,有需求的朋友可以了解下
    2012-11-11
  • c#一個定時重啟的小程序實現(xiàn)代碼

    c#一個定時重啟的小程序實現(xiàn)代碼

    今天有個朋友找我問有沒有一些能像Windows一樣計劃任務重啟的軟件,我也不清楚。他它說能讓我做一個給他它么?我考慮了一下,他的服務器都是有安裝.NET框架的,那可以用.NET來使下~~!
    2008-09-09
  • C#泛型詳解及關鍵字作用

    C#泛型詳解及關鍵字作用

    這篇文章主要來講講c#中的泛型,因為泛型在c#中有很重要的位置,對于寫出高可讀性,高性能的代碼有著關鍵的作用,大家都知道泛型公共語言運行庫是非常重要功能,那么為什么使用泛型呢,帶著這個問題一起通過本文學習下吧
    2021-08-08
  • C#關鍵字in、out、ref的作用與區(qū)別

    C#關鍵字in、out、ref的作用與區(qū)別

    這篇文章介紹了C#關鍵字in、out、ref的作用與區(qū)別,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • C#實現(xiàn)文本文件讀寫方法匯總

    C#實現(xiàn)文本文件讀寫方法匯總

    本文給大家匯總介紹了C#實現(xiàn)文本文件讀寫的方法,十分的簡單實用,有需要的小伙伴可以參考下。
    2015-06-06
  • C#通過重寫Panel改變邊框顏色與寬度的方法

    C#通過重寫Panel改變邊框顏色與寬度的方法

    這篇文章主要介紹了C#通過重寫Panel改變邊框顏色與寬度的方法,涉及C#針對Panel控件的重寫與屬性設置技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08

最新評論