【C#学习】互斥锁Mutex

今日拜读大佬代码,偶见一个名为mutex的类,没有接触过,记录一下学习结果。

参考微软的官方文档Mutex 类 (System.Threading) | Microsoft Docs

mutex意为互斥体,主要作用是不允许多个线程访问同一段代码,似乎与操作系统中的公共资源访问保护类似。

下面是微软官方的例程,进行了一些简单的翻译

using System;
using System.Threading;

namespace ConsoleApp1
{
    class Program
    {
        // 创建一个新的互斥体。创建的线程不拥有互斥锁。
        private static Mutex mut = new Mutex();

        private const int numIterations = 1;
        //创建受保护线程的数量
        private const int numThreads = 3;
        static void Main(string[] args)
        {
            // 创建将使用受保护资源的线程。
            for (int i = 0; i < numThreads; i++)
            {
                Thread newThread = new Thread(new ThreadStart(ThreadProc));
                newThread.Name = String.Format("线程{0}", i + 1);
                newThread.Start();
            }

            // 主线程退出,但应用程序继续运行,直到所有前台线程退出
        }
        private static void ThreadProc()
        {
            for (int i = 0; i < numIterations; i++)
            {
                UseResource();
            }
        }
        //此方法表示必须同步的资源,以便一次只能有一个线程进入。
        private static void UseResource()
        {
            // Wait until it is safe to enter.
            Console.WriteLine("{0} 正在请求互斥锁",
                              Thread.CurrentThread.Name);

            //阻止当前线程,直到当前waithandel接收到信号
            mut.WaitOne();

            Console.WriteLine("{0} 进入了保护区域",
                              Thread.CurrentThread.Name);

            // 干了一些事,用延迟来替代
            Thread.Sleep(500);

            Console.WriteLine("{0} 正在离开保护区",
                Thread.CurrentThread.Name);

            // 释放互斥锁.
            mut.ReleaseMutex();
            Console.WriteLine("{0} 释放了互斥锁",
                Thread.CurrentThread.Name);
        }
    }
}

下面是运行结果

 可以看到线程123依次请求了互斥锁,然后线程123依次进入访问区域,这里存在一个问题从上述结果来看似乎线程2在线程1释放之前就进入了保护区域,不符合逻辑,实际上多次运行顺序各有不同,原因是互斥锁释放和文字打印有一定时间差,在这个时间内线程2就进入了保护区域

现在将这两个语句交换位置得到结果(线程进入顺序发生了变化这个原因未找到)

 

 可以看出这三个线程是在释放后才依次进出,如有问题希望批评指正。

posted @   Canicula-X  阅读(57)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示