当前位置: 首页 > news >正文

C# 跨进程 临界区 互斥 进程锁


namespace System
{using System.Diagnostics;using System.Threading;/// <summary>/// 跨进程的临界区。/// </summary>public sealed class ProcessLocker : IDisposable{/// <summary>/// 使用示例。/// </summary>[Conditional("DEBUG")]public static void Test(){using (new ProcessLocker("TestLocker")) // 成功进入跨进程临界区。{// 跨进程的临界区。} // 成功退出跨进程临界区。}public ProcessLocker(string name){try{this.name = name;bool createdNew;// 尝试创建或打开现有的命名Mutex。this.mutex = new Mutex(true, name, out createdNew);// 如果Mutex已存在,则尝试获取所有权if (!createdNew){// 没有获取所有权期间,阻塞this.IsWaitOne = this.mutex.WaitOne(-1);}else{// 新创建的Mutex,已拥有所有权this.IsWaitOne = true;}}catch (AbandonedMutexException){// 前任所有者未释放Mutex,当前线程获得所有权this.IsWaitOne = true;}catch (Exception ex){Trace.WriteLine($"Process locker init {name} exception: " + ex);}}~ProcessLocker(){Dispose(false);}private readonly string name;private readonly Mutex mutex;public bool IsDisposed { get; private set; }public bool IsWaitOne { get; private set; }public void Dispose(){Dispose(true);GC.SuppressFinalize(this);}private void Dispose(bool disposing){if (!IsDisposed){IsDisposed = true;if (mutex != null && IsWaitOne){try{// 释放Mutex并销毁资源mutex.ReleaseMutex();if (disposing){(mutex as IDisposable)?.Dispose();}}catch (Exception ex){Trace.WriteLine($"Process locker dispose {name} exception: " + ex);}}}}}
}

以下是对提供的 ProcessLocker 代码的主要内容和优点的分析:


主要内容

  1. 跨进程临界区实现
    通过命名 Mutex(互斥体)实现跨进程的同步锁,确保多个进程或线程中只有一个能进入临界区代码块。适用于需要全局资源独占访问的场景。

  2. 基于 IDisposable 的资源管理
    类实现 IDisposable 接口,利用 using 语句自动释放锁,避免资源泄漏。通过 Dispose() 方法确保 Mutex 的释放和销毁。

  3. 异常处理机制

    • 捕获 AbandonedMutexException:处理前一个进程未正确释放锁的情况,当前线程直接获得所有权。
    • 记录其他异常(如权限不足、命名冲突等),避免进程崩溃。
  4. 状态跟踪

    • IsWaitOne 属性标记是否成功获取锁。
    • IsDisposed 属性标识对象是否已释放,防止重复释放资源。
  5. 调试支持

    • 提供 Test() 方法(仅在 DEBUG 模式下编译),作为使用示例,帮助开发者快速理解用法。

代码优点

  1. 封装性与易用性
    将底层的 Mutex 操作封装成简洁的 ProcessLocker 类,用户只需通过 using 块即可实现跨进程同步,无需直接处理 Mutex 的复杂性。

  2. 健壮的资源管理

    • 结合 IDisposable 和终结器(~ProcessLocker()),确保即使未显式调用 Dispose(),资源也会在垃圾回收时释放。
    • 使用 GC.SuppressFinalize 优化性能,避免重复释放。
  3. 异常鲁棒性

    • 处理 AbandonedMutexException 避免因前序进程崩溃导致的死锁。
    • 在构造函数和 Dispose 中捕获异常并记录日志,提升系统稳定性。
  4. 跨进程支持
    基于命名 Mutex 的机制天然支持跨进程同步,适用于多进程协作场景(如单实例应用、共享文件访问等)。

  5. 调试友好性
    Test() 方法提供直观的使用示例,配合 Conditional("DEBUG") 特性,确保示例代码仅在调试时编译,不影响生产环境。

  6. 状态反馈
    IsWaitOne 属性允许调用者检查是否成功获取锁,便于后续逻辑处理或错误排查。


潜在改进点

  • 全局命名空间支持
    Windows 系统下,跨会话的全局 Mutex 需添加 Global\ 前缀(如 Global\TestLocker)。当前代码未显式处理,可能限制跨会话使用。

  • 锁获取失败处理
    构造函数中若 WaitOne 失败(如超时),IsWaitOne 会为 false,但未提供显式错误通知机制,调用者需主动检查该属性。

  • 线程安全增强
    可进一步确保多线程环境下 Dispose() 的原子性,但现有代码通过 IsDisposed 标记已具备基础防护。


总结

ProcessLocker 类是一个高效、健壮的跨进程同步工具,通过封装 Mutex 和资源管理机制,简化了多进程环境下的临界区控制。其异常处理和状态跟踪设计使其适合高可靠性场景,而清晰的接口和调试支持则降低了使用门槛。

相关文章:

  • 轻量级景好鼠标录制器
  • 基于javaweb的SSM+Maven小区失物招领系统设计与实现(源码+文档+部署讲解)
  • 从代码学习深度学习 - 编译器和解释器 PyTorch 版
  • 一个C#扩展库,让Dapper的CRUD操作更简单
  • unity脚本-FBX自动化模型面数校验
  • c语言数据结构------------归并排序(终)
  • Jenkins的地位和作用
  • 《AI大模型应知应会100篇》第32篇:大模型与医疗健康:辅助诊断的可能性与风险
  • 【人脸识别】百度人脸识别H5方案对接
  • Spring AOP + Logback + MDC全链路日志追踪
  • Cesium学习笔记——坐标系统及坐标转换
  • 实用生活c语言脚本
  • Android如何通过aspectj打造一个无侵入式动态权限申请框架
  • webpack基础使用了解(入口、出口、插件、加载器、优化、别名、打包模式、环境变量、代码分割等)
  • IDEA创建Gradle项目然后删除报错解决方法
  • 调整IntelliJ IDEA中当前文件所在目录的显示位置
  • [原创](现代Delphi 12指南):[macOS 64bit App开发]:在Mac App Store外创建、部署与公证
  • CoinNexus Chain 推出泰利风暴,开启 Web3.0 智能金融元宇宙科技新时代
  • Lua 第8部分 补充知识
  • webrtc使用
  • “动漫短剧”值不值得做?
  • 广汽全域赋能,领程皮卡概念车重磅登陆上海车展
  • 山东省淄博市委原常委宋振波被“双开”
  • 中国与柬埔寨签署多领域合作文件
  • 护航民营企业出海,上海设37家维权工作站、建立近百人专家团队
  • 特朗普“炮轰”美联储带崩美股!道指跌超900点,黄金再创新高