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
代码的主要内容和优点的分析:
主要内容
-
跨进程临界区实现
通过命名Mutex
(互斥体)实现跨进程的同步锁,确保多个进程或线程中只有一个能进入临界区代码块。适用于需要全局资源独占访问的场景。 -
基于
IDisposable
的资源管理
类实现IDisposable
接口,利用using
语句自动释放锁,避免资源泄漏。通过Dispose()
方法确保Mutex
的释放和销毁。 -
异常处理机制
- 捕获
AbandonedMutexException
:处理前一个进程未正确释放锁的情况,当前线程直接获得所有权。 - 记录其他异常(如权限不足、命名冲突等),避免进程崩溃。
- 捕获
-
状态跟踪
IsWaitOne
属性标记是否成功获取锁。IsDisposed
属性标识对象是否已释放,防止重复释放资源。
-
调试支持
- 提供
Test()
方法(仅在DEBUG
模式下编译),作为使用示例,帮助开发者快速理解用法。
- 提供
代码优点
-
封装性与易用性
将底层的Mutex
操作封装成简洁的ProcessLocker
类,用户只需通过using
块即可实现跨进程同步,无需直接处理Mutex
的复杂性。 -
健壮的资源管理
- 结合
IDisposable
和终结器(~ProcessLocker()
),确保即使未显式调用Dispose()
,资源也会在垃圾回收时释放。 - 使用
GC.SuppressFinalize
优化性能,避免重复释放。
- 结合
-
异常鲁棒性
- 处理
AbandonedMutexException
避免因前序进程崩溃导致的死锁。 - 在构造函数和
Dispose
中捕获异常并记录日志,提升系统稳定性。
- 处理
-
跨进程支持
基于命名Mutex
的机制天然支持跨进程同步,适用于多进程协作场景(如单实例应用、共享文件访问等)。 -
调试友好性
Test()
方法提供直观的使用示例,配合Conditional("DEBUG")
特性,确保示例代码仅在调试时编译,不影响生产环境。 -
状态反馈
IsWaitOne
属性允许调用者检查是否成功获取锁,便于后续逻辑处理或错误排查。
潜在改进点
-
全局命名空间支持
Windows 系统下,跨会话的全局Mutex
需添加Global\
前缀(如Global\TestLocker
)。当前代码未显式处理,可能限制跨会话使用。 -
锁获取失败处理
构造函数中若WaitOne
失败(如超时),IsWaitOne
会为false
,但未提供显式错误通知机制,调用者需主动检查该属性。 -
线程安全增强
可进一步确保多线程环境下Dispose()
的原子性,但现有代码通过IsDisposed
标记已具备基础防护。
总结
该 ProcessLocker
类是一个高效、健壮的跨进程同步工具,通过封装 Mutex
和资源管理机制,简化了多进程环境下的临界区控制。其异常处理和状态跟踪设计使其适合高可靠性场景,而清晰的接口和调试支持则降低了使用门槛。