.NET 中使用 Mutex 进行跨越进程边界的同步
Mutex 是 Mutual Exclusion 的缩写,是互斥锁,用于防止两个线程同时对计算机上的同一个资源进行访问。不过相比于其他互斥的方式,Mutex 能够跨越线程边界。
本文内容
- Mutex 是什么?
- 简单的 Mutex(不能跨进程互斥)
- 创建跨进程互斥的 Mutex
- 处理异常情况
- ApplicationException
- AbandonedMutexException
- 参考资料
在有 UI 线程参与的同步锁(如 AutoResetEvent)内部使用 await 可能导致死锁。
也就是说,当你需要等待的时候,catch 一下异常。在 catch 完之后,你并不需要再次使用 WaitOne 来等待,因为即便发生了异常,你也依然获得了锁。这一点你可以通过调用 ReleaseMutex 来验证,因为前面我们说了只有拥有锁的线程才可以释放锁。
private static void WaitOne()
{
var mutex = new Mutex(false, "Walterlv.Mutex");
try
{
mutex.WaitOne();
}
catch (AbandonedMutexException ex)
{
Console.WriteLine("发现被遗弃的锁");
}
Console.WriteLine("获得了锁");
}
Mutexes - Microsoft Docs
我的博客会首发于 https://walterlv.com/,而 CSDN 和博客园仅从其中摘选发布,而且一旦发布了就不再更新。

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://blog.csdn.net/wpwalter),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。