全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C# 如何使用互斥锁(Mutex) - 实现跨进程的线程同步

Mutex是C#中用于跨进程线程同步的互斥锁,通过命名Mutex实现多进程间的资源访问控制,确保同一时间仅一个进程能进入临界区;1. 使用new Mutex(true, "name", out createdNew)创建命名Mutex,名称需唯一(如用GUID),若createdNew为false表明已有实例运行,可用于防止程序多开;2. 必须在finally块中调用ReleaseMutex()释放锁,防止异常退出导致资源泄漏;3. 可通过WaitOne(TimeSpan)设置超时等待获取Mutex,避免无限阻塞;4. 多个进程可借助同一命名Mutex协调对共享资源(如文件)的访问,实现轮流写入等安全操作。

在C#中,当你需要实现跨进程的线程同步时,Mutex 是一个非常有用的同步原语。与 lockMonitor 只能在同一进程内起作用不同,Mutex 支持跨进程的资源访问控制,确保某一时刻只有一个进程能进入临界区。

什么是 Mutex?

Mutex(互斥锁)是一种同步对象,用于保护共享资源不被多个线程或进程同时访问。它有两种状态:已获取(signaled)和未获取(nonsignaled)。当一个线程或进程获得 Mutex 后,其他试图获取它的线程/进程将被阻塞,直到 Mutex 被释放。

Mutex 特别适用于防止程序多开,或协调多个进程对某个文件、设备或其他系统资源的访问。

创建和使用命名 Mutex 实现跨进程同步

要实现跨进程同步,必须使用命名 Mutex。无名 Mutex 只能在同一进程内使用。

下面是一个防止应用程序多开的示例:

using System;
using System.Threading;

class Program
{
    private static Mutex mutex = null;
    const string MUTEX_NAME = "MyUniqueApplicationMutex";

    static void Main()
    {
        // 尝试创建一个命名 Mutex
        bool createdNew;
        mutex = new Mutex(true, MUTEX_NAME, out createdNew);

        if (!createdNew)
        {
            Console.WriteLine("程序已在运行!");
            return;
        }

        try
        {
            Console.WriteLine("程序正在运行... 按任意键退出。");
            Console.ReadKey();
        }
        finally
        {
            // 必须释放 Mutex,否则可能造成资源泄漏
            mutex.ReleaseMutex();
        }
    }
}

说明:

  • new Mutex(true, "name", out createdNew):第一个参数表示是否立即拥有该 Mutex;第二个是唯一名称;第三个输出参数指示当前进程是否是 Mutex 的创建者。
  • 如果另一个进程已经创建了同名 Mutex,则 createdNewfalse,此时可判断程序已在运行。
  • 必须调用 ReleaseMutex() 来释放锁,否则即使程序退出,Mutex 仍可能处于占用状态(尤其是异常退出时)。

使用 Mutex 等待资源访问

你可以使用 WaitOne() 方法等待获取 Mutex,支持超时机制,避免无限等待。

if (mutex.WaitOne(TimeSpan.FromSeconds(5), false))
{
    try
    {
        // 安全地操作共享资源
        Console.WriteLine("成功获取 Mutex,开始工作...");
    }
    finally
    {
        mutex.ReleaseMutex();
    }
}
else
{
    Console.WriteLine("无法获取 Mutex,资源正被占用或超时。");
}

注意: 使用 WaitOne 时建议配合 try-finally 块,确保即使发生异常也能正确释放 Mutex。

跨进程协调多个实例

除了防多开,你也可以让多个进程通过 Mutex 协同工作。例如,多个进程轮流写日志文件:

  • 每个进程尝试获取同一个命名 Mutex。
  • 获取成功后写入日志,完成后释放 Mutex。
  • 这样可避免多个进程同时写文件导致内容混乱。

基本上就这些。使用 Mutex 时记得命名要唯一(可用 GUID),并始终确保释放锁,尤其在异常路径下。不复杂但容易忽略。


# c#  # app  # ai  # try  # 输出参数  # finally  # 线程  # 对象  # 多个  # 已在  # 访问控制  # 是一个  # 是一种  # 互斥  # 你可以  # 第一个  # 尤其是  # 已有 


相关文章: 如何设置并定期更换建站之星安全管理员密码?  如何在香港免费服务器上快速搭建网站?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  建站之星与建站宝盒如何选择最佳方案?  建站之星导航菜单设置与功能模块配置全攻略  零服务器AI建站解决方案:快速部署与云端平台低成本实践  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  网站制作说明怎么写,简述网页设计的流程并说明原因?  高性能网站服务器配置指南:安全稳定与高效建站核心方案  建站之星×万网:智能建站系统+自助建站平台一键生成  头像制作网站在线制作软件,dw网页背景图像怎么设置?  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  建站之星安装需要哪些步骤及注意事项?  如何用腾讯建站主机快速创建免费网站?  如何用5美元大硬盘VPS安全高效搭建个人网站?  网站制作员失业,怎样查看自己网站的注册者?  如何选择高效稳定的ISP建站解决方案?  建站之星logo尺寸如何设置最合适?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  javascript中对象的定义、使用以及对象和原型链操作小结  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  北京网站制作网页,网站升级改版需要多久?  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  一键网站制作软件,义乌购一件代发流程?  网站制作知乎推荐,想做自己的网站用什么工具比较好?  网站制作的步骤包括,正确网址格式怎么写?  如何用虚拟主机快速搭建网站?详细步骤解析  招商网站制作流程,网站招商广告语?  Swift开发中switch语句值绑定模式  css网站制作参考文献有哪些,易聊怎么注册?  网站制作的方法有哪些,如何将自己制作的网站发布到网上?  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  如何打造高效商业网站?建站目的决定转化率  学校免费自助建站系统:智能生成+拖拽设计+多端适配  广州网站建站公司选择指南:建站流程与SEO优化关键词解析  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  如何用AWS免费套餐快速搭建高效网站?  大连 网站制作,大连天途有线官网?  营销式网站制作方案,销售哪个网站招聘效果最好?  攀枝花网站建设,攀枝花营业执照网上怎么年审?  广州营销型建站服务商推荐:技术优势与SEO优化解析  安云自助建站系统如何快速提升SEO排名?  南京网站制作费用,南京远驱官方网站?  招贴海报怎么做,什么是海报招贴?  宝塔面板创建网站无法访问?如何快速排查修复?  制作农业网站的软件,比较好的农业网站推荐一下?  建站之星多图banner生成与模板自定义指南 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。