c#互斥锁Mutex类用法介绍

c#互斥锁Mutex类用法介绍

什么是互斥锁?

在多线程编程中,为了防止多个线程同时访问共享资源导致数据混乱的问题,需要用到互斥锁。互斥锁是一种同步方式,它保证在同一时间只有一个线程可以访问共享资源。

Mutex类的用法

C#中,可以通过Mutex类实现互斥锁。使用Mutex类的步骤如下:

  1. 创建一个Mutex对象,可以通过Mutex类的构造函数来创建:
Mutex mutex = new Mutex();
  1. 在需要访问共享资源的代码块中调用Mutex对象的WaitOne()方法来获取锁,访问完成后调用ReleaseMutex()方法来释放锁:
mutex.WaitOne();    // 获取锁
// 访问共享资源的代码块
mutex.ReleaseMutex();    // 释放锁

示例一

在下面的示例中,我们创建了两个线程,其中一个线程在访问共享变量i的时候获取了锁,另一个线程就要等待获取锁的线程释放锁之后才能访问i。

using System;
using System.Threading;

class Program
{
    static void Main(string[] args)
    {
        Mutex mutex = new Mutex();
        int i = 0;

        Thread t1 = new Thread(() =>
        {
            mutex.WaitOne();    // 获取锁
            for (int j = 0; j < 100000; j++)
            {
                i++;
            }
            mutex.ReleaseMutex();    // 释放锁
        });
        Thread t2 = new Thread(() =>
        {
            mutex.WaitOne();    // 获取锁
            for (int j = 0; j < 100000; j++)
            {
                i++;
            }
            mutex.ReleaseMutex();    // 释放锁
        });
        t1.Start();
        t2.Start();
        t1.Join();
        t2.Join();
        Console.WriteLine($"i = {i}");
    }
}

执行上面的代码,输出结果应该是200000,即两个线程对i进行了累加操作。

示例二

在下面的示例中,我们使用Mutex类来保证只有一个线程可以访问包含共享资源的代码块。

using System;
using System.Threading;

class Program
{
    static void Main(string[] args)
    {
        Mutex mutex = new Mutex();

        for (int i = 0; i < 5; i++)
        {
            new Thread(() =>
            {
                mutex.WaitOne();    // 获取锁
                Console.WriteLine($"当前线程ID为{Thread.CurrentThread.ManagedThreadId}");
                Console.WriteLine($"线程{Thread.CurrentThread.ManagedThreadId}进入临界区");
                Thread.Sleep(1000);
                Console.WriteLine($"线程{Thread.CurrentThread.ManagedThreadId}离开临界区");
                mutex.ReleaseMutex();    // 释放锁
            }).Start();
        }

        Console.ReadLine();
    }
}

在上面的代码中,我们通过Mutex对象来保护包含的代码块,其中WaitOne()方法获得锁,ReleaseMutex()方法释放锁,从而保证同一时间只有一个线程可以访问临界区,结果输出应该如下:

当前线程ID为4
线程4进入临界区
当前线程ID为3
线程3进入临界区
当前线程ID为5
线程5进入临界区
当前线程ID为6
线程6进入临界区
当前线程ID为7
线程7进入临界区
线程5离开临界区
线程7离开临界区
线程6离开临界区
线程3离开临界区
线程4离开临界区

从输出结果可以看出,每个线程都可以进入临界区执行,但是同一时间只有一个线程可以进入,即Mutex保证了同步。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#互斥锁Mutex类用法介绍 - Python技术站

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

相关文章

  • DropDownList设置客户端事件思路

    下面是关于 DropDownList 设置客户端事件的完整攻略: 思路简介 DropDownList 是 ASP.NET WebForm 中常用的组件之一,在前端页面上展示一个下拉列表框,并且支持使用 C#、VB 等服务器端语言动态生成下拉列表内容。如果需要在前端页面使用 JS 代码对 DropDownList 进行操作,就需要用到客户端事件,这里主要指的是…

    C# 2023年5月31日
    00
  • C#操作INI文件的方法详解

    C#操作INI文件的方法详解 什么是INI文件? INI文件(.INI文件)是Windows操作系统中常见的配置文件格式,它的简单文本格式使得多个应用程序和操作系统可以读取并修改它,通常用于保存程序或应用程序的配置信息。INI文件中的数据通常被组织为段落和参数的形式,在应用程序或操作系统中也可以通过读写INI文件来保存和读取配置信息。 C#中操作INI文件的…

    C# 2023年6月1日
    00
  • 在.net应用程序中运行其它EXE文件的方法

    在.NET应用程序中运行其他.exe文件可以通过 Process 类来实现。下面是实现运行其他.exe文件的步骤: 导入命名空间 System.Diagnostics using System.Diagnostics; 创建 Process 对象 Process process = new Process(); 设置 ProcessStartInfo 属性 …

    C# 2023年5月15日
    00
  • C#生成带注释的dll并引用实现

    生成带注释的dll并引用实现的完整攻略如下: 1. 创建Class Library项目 首先,我们需要在Visual Studio中创建一个Class Library项目,命名为”MyLibrary”(或其他你希望名字)。 2. 编写代码并添加注释 编写一个简单的类,并为类、属性和方法添加注释。代码如下: /// <summary> /// My…

    C# 2023年6月7日
    00
  • C#简单判断字符编码的方法

    C# 中判断字符编码的方法可以使用 Encoding 类的 GetEncoding 方法,该方法可以将一个编码名称或编号转换为一个 Encoding 对象。接下来将详细讲解如何使用该方法来判断字符编码。 获取字符的字节数组 在判断字符编码之前,我们需要先将字符串转换为其字节数组,可以使用 Encoding 的 GetBytes 方法来实现。以下是一个简单的示…

    C# 2023年6月7日
    00
  • C#抽象类的用法介绍

    C#抽象类的用法介绍 在 C# 中,抽象类是一种特殊的类,它不能被实例化,只能被继承。抽象类通常用于定义一些基础的行为和属性,而具体的实现则由其类来完成。下面是抽象类用法介绍: 定义抽象类 在 C# 中,可以使用 abstract 关键字来定义一个抽象类。抽象类通常包含一些抽象方法和非抽象方法。抽象方法是一种没有实现的方法,它只包含方法签名,而不包含方法体。…

    C# 2023年5月12日
    00
  • C#将html table 导出成excel实例

    下面是关于“C#将html table 导出成excel实例”的完整攻略。 1. 环境准备 在使用C#将HTML表格导出为Excel之前,需要确保安装并引用以下两个库: EPPlus :一个用于创建和读取Excel的开源库,可在 Nuget 上查找和安装。 HtmlAgilityPack: 一个用于处理HTML文档的开源库,可在 Nuget 上查找和安装。 …

    C# 2023年6月2日
    00
  • 深入分析C#异步编程详解

    深入分析C#异步编程详解攻略 什么是异步编程 异步编程是一种在执行操作时不阻塞后续操作的编程模式。在异步编程中,当一个操作被提交时,它的控制被立即返回给调用者,而不需要等待操作的完成。当操作完成后,调用者可以通过回调或轮询的方式获取操作结果。在C#中,异步编程主要通过异步方法和任务的方式实现。 异步编程的优势 异步编程有以下优势: 提高程序的资源利用率 减少…

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