欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

1、簡(jiǎn)述

在多線程或多進(jìn)程程序中,如果多個(gè)線程/程序同時(shí)訪問同一資源(文件、數(shù)據(jù)庫、端口、共享內(nèi)存),很容易導(dǎo)致數(shù)據(jù)沖突或程序異常。為了解決這種“并發(fā)訪問沖突”,C# 提供了強(qiáng)大的同步原語 —— Mutex(互斥量)

本文將深入講解:

  • 什么是 Mutex
  • Mutex 的常見應(yīng)用場(chǎng)景
  • 本地線程級(jí)鎖與跨進(jìn)程鎖的區(qū)別
  • 實(shí)戰(zhàn)樣例(單實(shí)例程序、防止重復(fù)寫文件、多線程同步)

2、什么是 Mutex?

Mutex(Mutual Exclusion)互斥量 是一種同步機(jī)制,用于確保同一時(shí)間只有一個(gè)線程或進(jìn)程能夠訪問特定資源。

關(guān)鍵特征:

  • Mutex 可以跨線程同步,也可以跨進(jìn)程同步;
  • lock 語句不同,Mutex 可以命名;
  • 可以通過名稱在不同程序間共享。

3、實(shí)踐樣例

3.1 基本使用方法

using System;
using System.Threading;

class Program
{
    static void Main()
    {
        using (var mutex = new Mutex())
        {
            mutex.WaitOne(); // 請(qǐng)求進(jìn)入臨界區(qū)
            Console.WriteLine("線程進(jìn)入臨界區(qū)...");

            Thread.Sleep(2000); // 模擬工作

            Console.WriteLine("線程退出臨界區(qū)。");
            mutex.ReleaseMutex(); // 釋放鎖
        }
    }
}

輸出:

線程進(jìn)入臨界區(qū)...
線程退出臨界區(qū)。

當(dāng)多個(gè)線程運(yùn)行這段代碼時(shí),會(huì) 排隊(duì)等待 獲取鎖,避免同時(shí)訪問資源。

3.2 跨進(jìn)程 Mutex(命名互斥量)

通過為 Mutex 指定名稱(例如 "Global\\MyAppMutex"),可以實(shí)現(xiàn)跨進(jìn)程級(jí)的鎖機(jī)制。即使是兩個(gè)不同的程序?qū)嵗?,也可以共享同一把互斥鎖。

using System;
using System.Threading;

class Program
{
    static Mutex? _mutex;

    static void Main()
    {
        bool createdNew;

        // 命名 Mutex,可被不同進(jìn)程共享
        _mutex = new Mutex(true, "Global\\MyUniqueAppName", out createdNew);

        if (!createdNew)
        {
            Console.WriteLine("程序已在運(yùn)行,請(qǐng)勿重復(fù)啟動(dòng)!");
            return;
        }

        Console.WriteLine("程序運(yùn)行中,按任意鍵退出...");
        Console.ReadKey();

        _mutex.ReleaseMutex();
    }
}

運(yùn)行兩次該程序:

程序已在運(yùn)行,請(qǐng)勿重復(fù)啟動(dòng)!

這樣可以防止用戶誤啟動(dòng)多個(gè)實(shí)例。

3.3 多線程寫文件保護(hù)

多個(gè)線程同時(shí)寫文件時(shí),如果沒有同步,很容易導(dǎo)致文件被覆蓋或數(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); // 模擬寫入時(shí)間
        }
        finally
        {
            fileMutex.ReleaseMutex(); // 釋放鎖
        }
    }
}

輸出:

線程 0 在 2025/10/24 寫入日志
線程 1 在 2025/10/24 寫入日志
...

文件內(nèi)容會(huì)有序?qū)懭耄粫?huì)出現(xiàn)錯(cuò)亂或覆蓋。

3.4 跨進(jìn)程文件訪問控制

兩個(gè)不同的程序(甚至是不同用戶進(jìn)程)寫同一個(gè)文件時(shí),也可以使用命名 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", $"寫入時(shí)間:{DateTime.Now}\n");
                Console.WriteLine("寫入完成。");
                Thread.Sleep(3000);
            }
            finally
            {
                mutex.ReleaseMutex();
            }
        }
    }
}

如果同時(shí)啟動(dòng)多個(gè)實(shí)例,它們會(huì)依次寫入 shared.txt 文件,避免數(shù)據(jù)混亂。

3.5 線程安全的資源管理

你可以用 Mutex 保護(hù)一些昂貴資源(例如數(shù)據(jù)庫連接、緩存文件、串口設(shè)備):

class SharedResource
{
    private readonly Mutex _mutex = new Mutex();
    private int _counter = 0;

    public void SafeIncrement()
    {
        _mutex.WaitOne();
        try
        {
            _counter++;
            Console.WriteLine($"當(dāng)前計(jì)數(shù):{_counter}");
        }
        finally
        {
            _mutex.ReleaseMutex();
        }
    }
}

4、結(jié)語

通過本文,你已經(jīng)掌握了:

  • Mutex 的概念與適用場(chǎng)景;
  • 單實(shí)例程序控制;
  • 多線程與跨進(jìn)程同步;
  • 文件寫入保護(hù)與資源安全訪問。

Mutex 是 C# 同步機(jī)制中最強(qiáng)大的工具之一,特別適用于需要跨進(jìn)程協(xié)調(diào)資源的場(chǎng)景(如后臺(tái)服務(wù)、日志系統(tǒng)、文件寫入、硬件訪問等)。

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

相關(guān)文章

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

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

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

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

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

    WPF實(shí)現(xiàn)多運(yùn)算符表達(dá)式計(jì)算器

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

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

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

    DataReader、DataSet、DataAdapter和DataView使用介紹

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

    c#一個(gè)定時(shí)重啟的小程序?qū)崿F(xiàn)代碼

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

    C#泛型詳解及關(guān)鍵字作用

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

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

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

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

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

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

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

最新評(píng)論