.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
  • Mutex Constructor (System.Threading) - Microsoft Docs
  • Mutex Class (System.Threading) - Microsoft Docs

  • 我的博客会首发于 https://walterlv.com/,而 CSDN 和博客园仅从其中摘选发布,而且一旦发布了就不再更新。

    知识共享许可协议

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