MST

星途 面试题库

面试题:C#多线程编程中线程同步机制之Mutex的应用

在C#多线程编程环境下,假设有多个线程需要访问一个共享资源,且同一时间只能有一个线程访问该资源。请用代码示例说明如何使用Mutex来实现这种线程同步机制,并解释Mutex的工作原理。
12.8万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试

代码示例

using System;
using System.Threading;

class Program
{
    private static Mutex mutex = new Mutex();
    private static int sharedResource = 0;

    static void Main()
    {
        // 创建并启动多个线程
        Thread[] threads = new Thread[5];
        for (int i = 0; i < threads.Length; i++)
        {
            threads[i] = new Thread(AccessSharedResource);
            threads[i].Start();
        }

        // 等待所有线程完成
        foreach (var thread in threads)
        {
            thread.Join();
        }

        Console.WriteLine("所有线程执行完毕,共享资源的值为: " + sharedResource);
        mutex.Close();
    }

    static void AccessSharedResource()
    {
        // 请求Mutex的控制权
        mutex.WaitOne();
        try
        {
            // 访问共享资源
            Console.WriteLine(Thread.CurrentThread.Name + " 进入临界区,开始访问共享资源。");
            sharedResource++;
            Console.WriteLine(Thread.CurrentThread.Name + " 对共享资源操作后,其值为: " + sharedResource);
            Console.WriteLine(Thread.CurrentThread.Name + " 离开临界区。");
        }
        finally
        {
            // 释放Mutex的控制权
            mutex.ReleaseMutex();
        }
    }
}

Mutex工作原理

  1. 基本概念:Mutex(互斥锁)是一种同步基元,它只允许一个线程进入临界区,从而保证同一时间只有一个线程可以访问共享资源。它维护一个内部计数器,初始值为1。
  2. 获取锁:当一个线程调用 WaitOne 方法时,Mutex的内部计数器减1。如果计数器变为0,意味着该线程获得了Mutex的控制权,可以进入临界区访问共享资源。如果计数器已经为0(表示已有其他线程持有Mutex),调用 WaitOne 的线程将被阻塞,直到持有Mutex的线程释放它。
  3. 释放锁:当持有Mutex的线程调用 ReleaseMutex 方法时,Mutex的内部计数器加1。如果此时有其他线程在等待Mutex,系统会选择一个等待的线程,将其从阻塞状态唤醒,该线程可以再次尝试获取Mutex(即再次调用 WaitOne 使计数器减1),进入临界区。这样就确保了同一时间只有一个线程能够访问共享资源,实现了线程同步。