【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就进入了保护区域
现在将这两个语句交换位置得到结果(线程进入顺序发生了变化这个原因未找到)
可以看出这三个线程是在释放后才依次进出,如有问题希望批评指正。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?