C#高级:使用进程锁语法避免线程竞争资源,做到并发控制(Mutex)
一、基础代码
namespace Demo
{class Program{static async Task Main(){int pid = Process.GetCurrentProcess().Id;Console.WriteLine($"这里是进程{pid},尝试获取锁");using (var mutex = new Mutex(false, "MySharedResource")){mutex.WaitOne(); // 获取锁try{// 假设在访问共享资源Console.WriteLine($"这里是进程{pid},已获取到锁");Thread.Sleep(100000);}finally{mutex.ReleaseMutex(); // 释放锁Console.WriteLine($"这里是进程{pid},已释放锁");}}Console.ReadLine();}}
}
二、进程锁原理
命名Mutex(如MySharedResource)在系统全局唯一,不同进程通过同一名称竞争锁,确保同一时刻仅一个进程可访问共享资源。
三、进程锁查询
1.下载相关工具
下载SysinternalsSuite,我安装在了D:\SysinternalsSuite目录下
介绍 - Sysinternals | Microsoft Learn

2.运行程序
运行C#程序,即上面的基础代码,获取进程锁(命名:MySharedResource)
3.查询
cmd,管理员身份打开刚刚SysinternalsSuite的安装目录,利用它的handle工具查询Mutex相应的命名(我的程序命名是MySharedResource,你要改成你自己的命名)
D:\SysinternalsSuite>handle -a | findstr /i "MySharedResource"
![]()
主动终止程序后,再次查询,发现查询不到,说明进程锁是有效的,也可以尝试同时运行两个C#程序验证进程锁的有效性。
四、Mutex 和 SemaphoreSlim对比

五、结论
1.Mutex是进程锁,可以通过SysinternalsSuite的handle工具查询相关信息
2.程序崩溃退出或者主动结束程序进程,都可以释放Mutex锁
