最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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)功能

    這篇文章介紹了C#在Windows窗體控件實現(xiàn)內容拖放(DragDrop)的功能,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C# 委托的三種調用示例(同步調用 異步調用 異步回調)

    C# 委托的三種調用示例(同步調用 異步調用 異步回調)

    本文將主要通過同步調用、異步調用、異步回調三個示例來講解在用委托執(zhí)行同一個加法類的時候的的區(qū)別和利弊
    2013-12-12
  • c# 異步編程基礎講解

    c# 異步編程基礎講解

    這篇文章主要介紹了c# 異步編程的相關資料,幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下
    2021-04-04
  • C# PropertyGrid使用案例詳解

    C# PropertyGrid使用案例詳解

    這篇文章主要介紹了C# PropertyGrid使用案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • C#使用Obfuscar進行代碼混淆的實現(xiàn)

    C#使用Obfuscar進行代碼混淆的實現(xiàn)

    本文主要介紹了C#使用Obfuscar進行代碼混淆的實現(xiàn),使用Obfuscar混淆C#代碼以保護知識產(chǎn)權,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-07-07
  • C#中值類型和引用類型的區(qū)別

    C#中值類型和引用類型的區(qū)別

    這篇文章介紹了C#中值類型和引用類型的區(qū)別,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-03-03
  • C#中單例的實現(xiàn)方法

    C#中單例的實現(xiàn)方法

    這篇文章主要介紹了C#中單例的實現(xiàn)方法,以實例形式分析了C#中單例的原理與實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-01-01
  • C#二叉搜索樹算法實現(xiàn)步驟和實例代碼

    C#二叉搜索樹算法實現(xiàn)步驟和實例代碼

    二叉搜索樹(Binary?Search?Tree,簡稱BST)是一種節(jié)點有序排列的二叉樹數(shù)據(jù)結構,這篇文章主要介紹了C#二叉搜索樹算法實現(xiàn)步驟和實例代碼,需要的朋友可以參考下
    2024-08-08
  • C#中圖片的Base64編碼與解碼轉換詳解

    C#中圖片的Base64編碼與解碼轉換詳解

    在C#中,我們可以使用Base64編碼將圖片轉換為字符串,也可以將Base64編碼的字符串轉換回圖片,這通常用于在需要文本表示圖像數(shù)據(jù)的場合(例如在Web開發(fā)中傳輸圖像數(shù)據(jù)),本文介紹了C#中圖片的Base64編碼與解碼轉換,需要的朋友可以參考下
    2024-12-12
  • C#實現(xiàn)圖片輪播功能的示例代碼

    C#實現(xiàn)圖片輪播功能的示例代碼

    這篇文章主要為大家詳細介紹了如何利用C#實現(xiàn)圖片輪播功能,文中的示例代碼講解詳細,對我們學習C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12

最新評論

包头市| 静海县| 胶州市| 荆州市| 嵩明县| 石门县| 彝良县| 南澳县| 永年县| 丹东市| 云安县| 伊宁县| 江陵县| 同德县| 南平市| 汕尾市| 夏河县| 赤壁市| 女性| 抚远县| 保靖县| 芒康县| 仪征市| 雷波县| 外汇| 广灵县| 陵水| SHOW| 甘孜| 旅游| 石嘴山市| 巴楚县| 乌兰浩特市| 枣阳市| 南康市| 湘潭县| 开化县| 彩票| 崇左市| 揭东县| 肃宁县|