C#多线程系列之进程同步Mutex类

C#多线程系列之进程同步Mutex类

概述

在多线程编程中,由于线程的并发访问,容易出现共享变量问题,需要通过锁机制实现互斥访问,避免线程间的竞争。而Mutex(Mutual Exclusion)就是一种进程同步的机制,可以保证多线程或多进程中的共享资源的互斥访问,从而实现线程安全。

Mutex类

在C#中,Mutex类提供了一种方便的进程同步机制,通过Mutex.WaitOne()方法可以阻塞其他线程或进程对共享变量进行访问。

下面展示一个Mutex的详细使用示例。

using System;
using System.Threading;

namespace MutexDemo
{
    class Program
    {
        static Mutex mutex = new Mutex();

        static int counter = 0;

        static void Main(string[] args)
        {
            Thread t1 = new Thread(IncrementCounter);
            Thread t2 = new Thread(IncrementCounter);

            t1.Start();
            t2.Start();

            t1.Join();
            t2.Join();

            Console.WriteLine($"Final counter value is: {counter}");

            Console.ReadKey();
        }

        static void IncrementCounter()
        {
            for(int i = 0; i < 100000; i++)
            {
                mutex.WaitOne();
                counter++;
                mutex.ReleaseMutex();
            }
        }
    }
}

在上述代码中,我们通过Mutex.WaitOne()方法来实现线程间的访问互斥,并通过mutex.ReleaseMutex()方法释放锁,实现线程安全的共享变量的操作。

应用场景

Mutex类一般用于多线程或多进程的同步,具体应用场景包括但不限于:

  1. 文件或数据库访问;
  2. 内存资源的访问;
  3. 任何需要防止竞争访问的共享资源操作。

示例

下面通过两个示例来进一步说明Mutex类的使用方法。

示例1:文件读写

通过Mutex可以很方便地实现对文件的并发读写操作,从而防止读写锁冲突和数据丢失。

using System;
using System.IO;
using System.Threading;

namespace MutexDemo
{
    class Program
    {
        static Mutex mutex = new Mutex();

        static string filePath = "test.txt";

        static void Main(string[] args)
        {
            StreamWriter writer1 = new StreamWriter(filePath, true);
            StreamWriter writer2 = new StreamWriter(filePath, true);

            Thread t1 = new Thread(() => WriteFile(writer1, "Thread1"));
            Thread t2 = new Thread(() => WriteFile(writer2, "Thread2"));

            t1.Start();
            t2.Start();

            t1.Join();
            t2.Join();

            writer1.Dispose();
            writer2.Dispose();

            Console.WriteLine("Write completed.");
            Console.ReadKey();
        }

        static void WriteFile(StreamWriter writer, string threadName)
        {
            mutex.WaitOne();
            writer.WriteLine($"{threadName} is writing file...");
            Thread.Sleep(1000);
            mutex.ReleaseMutex();
        }
    }
}

示例2:多进程访问共享资源

通过Mutex,可以实现多个进程之间对共享资源的安全访问。

using System;
using System.Diagnostics;
using System.Threading;

namespace MutexDemo
{
    class Program
    {
        static Mutex mutex = new Mutex();

        static void Main(string[] args)
        {
            Process[] processes = new Process[3];

            for (int i = 0; i < 3; i++)
            {
                ProcessStartInfo info = new ProcessStartInfo("MutexDemo.exe", i.ToString());
                processes[i] = Process.Start(info);
            }

            foreach (Process p in processes)
            {
                p.WaitForExit();
            }

            Console.WriteLine("All processes exited.");
            Console.ReadKey();
        }

        static void PrintNumber(int processNumber)
        {
            mutex.WaitOne();
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine($"Process {processNumber} prints {i+1}");
                Thread.Sleep(50);
            }
            mutex.ReleaseMutex();
        }
    }
}

在上述示例中,我们通过Mutex类来控制多个进程对共享资源的访问,从而实现安全的进程间通讯。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#多线程系列之进程同步Mutex类 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • C#采用mouse_event函数实现模拟鼠标功能

    为了达到你需要的详细性,我将分为以下几个部分来讲解: 什么是mouse_event函数? 如何在C#中使用mouse_event函数? 示例说明 1. 什么是mouse_event函数? mouse_event 函数是一个Windows API,在Windows操作系统中常用于模拟鼠标点击、移动、滚轮滚动等鼠标相关的操作。该函数声明在 user32.dll中…

    C# 2023年6月7日
    00
  • 基于C#生成条形码操作知识汇总附源码下载

    基于C#生成条形码操作知识汇总 什么是条形码? 条形码(英文:Barcode)是用一组粗细不同、间距不同且被平行分成若干个基本单元的直线条及空白,按一定的编码规则,代表不同的字符信息,并经过光电扫描或照相机扫描得到的一种自动识别技术。 C# 中生成条形码的方式 在C#中,可以通过使用各种第三方库和自定义代码的方式来生成条形码。其中主要的几种库包括: ZXin…

    C# 2023年5月31日
    00
  • Unity TextMeshPro实现富文本超链接默认字体追加字体

    下面是关于“Unity TextMeshPro 实现富文本超链接默认字体追加字体”的完整攻略: 背景介绍 在 Unity 项目中,TextMeshPro 是一款很常用的文本 UI 组件。它支持富文本、超链接、字体嵌入等功能,并且相比 Unity 自带的 Text 组件,TextMeshPro 更加易用、性能更好。我们在项目中经常需要使用到富文本超链接,但默认…

    C# 2023年6月3日
    00
  • C#装箱和拆箱操作实例分析

    C#装箱和拆箱操作实例分析 装箱(Boxing) 装箱指的是将值类型转换为对象类型,即将一个值类型的数据放到一个堆分配的对象中。我们知道,值类型的数据是直接存储在内存栈空间中的,而对象类型的数据则是存储在堆空间中的。因此,当我们需要将一个值类型作为对象类型来处理时,就需要进行装箱操作。 下面是一个装箱操作的示例: int i = 123; object ob…

    C# 2023年6月7日
    00
  • C#打包应用程序,与.NETFramework介绍

    正如您所要求的,下面将详细讲解“C#打包应用程序,与.NET Framework介绍”的完整攻略。 什么是.NET Framework? .NET Framework是一个由Microsoft Corporation开发的软件框架,适用于Microsoft Windows操作系统。它提供了一组已经编译好的类库和运行时环境,用于简化C#以及其他.NET编程语言…

    C# 2023年6月1日
    00
  • c# String扩展 让你在PadLeft和PadRight时不再受单双字节问题困扰

    c# String扩展 让你在PadLeft和PadRight时不再受单双字节问题困扰 在c#中,PadLeft和PadRight是常用的字符串对齐方法,然而使用这两个方法时,常常会遇到单双字节问题。 为了解决这个问题,我们可以使用c# String扩展来进行修改。 1. 引入命名空间 在使用c# String扩展之前,需要在类文件头部引入命名空间Syste…

    C# 2023年6月7日
    00
  • C# Directory.GetFiles(string path):获取指定目录下的所有文件路径

    Directory.GetFiles(string path) 是C#中的一个静态方法,它返回指定目录中文件的名称,包括该目录中的所有子目录。它是 DirectoryInfo 类的一个实例方法 GetFiles 的静态等效方法。 方法签名 public static string[] GetFiles(string path); public static …

    C# 2023年4月19日
    00
  • C#中的匿名函数、lambda表达式解读

    C#中的匿名函数、lambda表达式解读 在C#中,匿名函数和lambda表达式提供了更强大、更简洁的代码实现方式,这两个概念通常都是一起出现的。 匿名函数 匿名函数就是没有名字的函数,在C#中可以使用delegate来定义。匿名函数主要有以下两种形式: delegate (parameters) { statements } delegate { stat…

    C# 2023年6月1日
    00
合作推广
合作推广
分享本页
返回顶部