0

0

C# 互斥锁Mutex使用方法 C#如何使用Mutex实现跨进程同步

煙雲

煙雲

发布时间:2026-03-17 11:19:00

|

638人浏览过

|

来源于php中文网

原创

Mutex是跨进程同步原语,非线程锁;命名Mutex才可跨进程,需注意Global/Local前缀与权限;必须用try/finally确保ReleaseMutex;WaitOne可能抛AbandonedMutexException,需校验资源一致性。

c# 互斥锁mutex使用方法 c#如何使用mutex实现跨进程同步

Mutex 是跨进程的,不是线程锁

别把它当 lock 用。C# 的 Mutex 默认就是系统级内核对象,天生支持跨进程同步——这是它和 Monitor(即 lock)、SpinLockReaderWriterLockSlim 的根本区别。如果你只在单个进程里用 Mutex,性能反而比 lock 差一个数量级,因为每次都要进内核态。

创建命名 Mutex 才能跨进程

无参构造 new Mutex() 创建的是匿名互斥体,仅限当前进程内可见。要让其他进程也能打开并等待它,必须用带名称的构造函数,并注意权限和作用域:

  • Mutex 名称是全局的,Windows 下区分大小写,建议全小写 + 连字符,例如 "myapp-config-writer"
  • 若需多用户会话间共享(如服务和桌面用户进程通信),名称前加 "Global\" 前缀;仅限当前会话用 "Local\"(默认隐含)
  • 普通用户进程无法访问 Global\ 下的对象,除非服务以 LocalSystem 启动且显式配置了 DACL,否则会抛 UnauthorizedAccessException
bool createdNew;
using (var mutex = new Mutex(false, "Local\myapp-data-sync", out createdNew))
{
    if (!mutex.WaitOne(3000)) // 等待 3 秒
    {
        Console.WriteLine("获取锁超时");
        return;
    }
<pre class='brush:php;toolbar:false;'>try
{
    // 临界区:读写共享文件、注册表、内存映射等
    File.WriteAllText(@"C:sharedconfig.json", data);
}
finally
{
    mutex.ReleaseMutex();
}

}

WaitOne 返回 false 不一定失败,要检查异常和所有权

WaitOne 超时返回 false,但更危险的是抛出异常——比如另一进程已终止却未释放 Mutex,此时 .NET 会检测到“放弃”状态并抛 AbandonedMutexException。这个异常意味着临界区可能处于不一致状态,不能忽略:

AskAI
AskAI

无代码AI模型构建器,可以快速微调GPT-3模型,创建聊天机器人

下载
  • 捕获 AbandonedMutexException 后,当前线程自动获得所有权,但你得先验证共享资源是否完好(比如校验文件 CRC、重载配置)
  • WaitOnemillisecondsTimeout 设为 0 表示“只试一次”,适合轮询场景;设为 Timeout.Infinite 会永久阻塞(慎用)
  • 不要依赖 createdNew 输出参数判断“谁先抢到”——它只表示创建时是否新建了内核对象,而非当前调用是否获得锁

必须手动 ReleaseMutex,且不能跨线程释放

Mutex 不像 lock 那样有语法糖保障释放。忘记 ReleaseMutex() 会导致死锁:其他进程永远等不到信号。更隐蔽的问题是,在 A 线程 WaitOne 成功后,由 B 线程调用 ReleaseMutex() 会抛 ApplicationException(.NET 报 “Object synchronization method was called from an unsynchronized block of code”)。

  • 务必用 try/finallyusing(配合 Dispose,它内部调用 ReleaseMutex)包裹临界区
  • Dispose() 只释放句柄,不销毁内核对象;只有最后一个持有句柄的进程调用 Close()Dispose(),系统才真正清理 Mutex
  • 进程崩溃时系统会自动清理,但异常退出(如 Environment.FailFast)可能跳过 finally,所以临界区操作本身也得有幂等或恢复机制

跨进程同步真正难的不是加锁,而是怎么定义“临界区操作”的边界和一致性——比如两个进程同时修改同一 JSON 文件,光靠 Mutex 防不了写一半崩溃。这时候得结合原子写入(重命名临时文件)、版本号或日志追加等手段。Mutex 只是那把钥匙,门后的东西得自己守好。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

458

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

549

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

337

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

84

2025.09.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

786

2023.08.10

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1541

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1172

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

837

2023.08.01

Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建
Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建

本指南详解Nginx在Windows、macOS及Linux系统的安装全流程。涵盖官方包解压、Homebrew一键部署、APT/YUM源配置及Docker容器化方案。无论新手或开发者,均可快速搭建运行环境,掌握跨平台核心指令,为后续配置与调优奠定坚实基础。

10

2026.03.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.5万人学习

C 教程
C 教程

共75课时 | 5.5万人学习

C++教程
C++教程

共115课时 | 22.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号