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#执行外部命令的方法

    执行外部命令是C#语言中常用的一种操作,可以通过Process类实现。下面是关于C#执行外部命令的完整攻略。 1. 创建Process对象 Process是C#语言中提供的一个用于执行外部程序的类。创建一个Process对象需要先引用System.Diagnostics命名空间,然后使用Process类的构造函数创建对象。 using System.Diag…

    C# 2023年6月3日
    00
  • C#中的匿名方法实例解析

    C#中的匿名方法实例解析 什么是匿名方法 在C#中,匿名方法指的是一个没有名称的方法,通常在方法参数中直接声明并实现,可以作为委托类型的参数或返回值使用。 匿名方法的形式如下: delegate (参数列表) { // 方法体 }; 其中,delegate是委托类型,参数列表和方法体与普通的方法一样,但没有方法名。通过定义参数列表和方法体来实现特定的功能。 …

    C# 2023年6月6日
    00
  • 如何在.NET Core中为gRPC服务设计消息文件(Proto)

    在.NET Core中,使用gRPC框架可以轻松地创建跨平台的高性能微服务。在使用gRPC时,消息文件(Proto)的设计非常重要,因为它直接影响到服务的交互和数据格式。 下面是在.NET Core中为gRPC服务设计消息文件(Proto)的完整攻略: 1.安装gRPC工具 首先需要安装gRPC工具,可以通过以下命令安装: dotnet tool insta…

    C# 2023年6月3日
    00
  • C#调用C++ DLL bool返回值始终为true的问题

    以下是详细的攻略: 问题描述 在使用C#调用C++编写的DLL时,可能会遇到bool类型的返回值无法正确返回的问题,始终返回true的情况。 原因分析 bool类型在C++中和C#中所代表的意义不同。在C++中,bool类型值只有0或1,而在C#中,bool类型值对应的是true或false。C#与C++之间的互操作性会导致不同的bool类型值的解释,从而出…

    C# 2023年5月15日
    00
  • C#窗体传值实例汇总

    C#窗体传值实例汇总 简介 在C#窗体应用程序中,传递数据是非常常见的需求,本文将对C#窗体传值相关知识进行汇总与讲解,包括如何在不同窗体间传递数据、如何使用委托传递数据、如何使用事件传递数据等。 不同窗体间传递数据 方法一:通过构造函数传值 在窗体A中,对窗口B进行实例化时,通过构造函数传递参数即可。 // 窗体A private void button1…

    C# 2023年6月7日
    00
  • C# ODP.NET 调用Oracle函数返回值时报错的一个解决方案

    下面是详细讲解“C#ODP.NET调用Oracle函数返回值时报错的一个解决方案”的完整攻略。 问题描述 在使用C#的ODP.NET连接Oracle数据库时,调用Oracle函数返回值时,往往会出现“Oracle.DataAccess.Client.OracleException: ORA-06502: PL/SQL: 数组或者记录数据类型必须具体化来解决这…

    C# 2023年5月15日
    00
  • 利用AOP实现SqlSugar自动事务

    当我们需要进行数据库事务时可以选择使用SqlSugar框架,它提供了很好的事务机制。但是在多个方法中,我们需要显式地开启和提交事务,这使得我们的代码显得复杂和冗长。为了避免这个问题,我们可以使用AOP(面向切面编程)思想来减少代码中事务的重复出现。 1. AOP基本概念 在AOP中,我们可以将一些通用代码分离出来并应用到多个方法中,这些方法称为切点。通用代码…

    C# 2023年6月6日
    00
  • asp.net获取当前网址url的各种属性(文件名、参数、域名 等)的代码

    当ASP.NET页面和控件运行时,可以通过Request对象的属性来获取当前网址的各种属性。 以下是获取当前网址url的一些常用属性: 获取当前页面的URL Request.Url.AbsoluteUri 该属性返回当前页面的完整URL,包括协议、域名、端口号、路径和查询字符串。如:https://www.example.com/test.aspx?id=1…

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