Windows平台上的.NET Mutex:我完成后会发生什么?

Car*_*los 10 .net c# windows mutex

我有一个简单的.NET程序,它检查是否已启动另一个实例:

    Mutex mutex = new Mutex(false,"MyMutexName");
    if (!mutex.WaitOne(1))
        return;

    try{
    //do stuff
    }
    catch{ //exceptions}
    finally
    {
        mutex.ReleaseMutex();
    }
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果你忘记在程序结束时释放它,那么互斥锁究竟会发生什么?在某些Windows控制面板组件中是否可见?它在哪里生活?

Han*_*ant 12

它是一个命名的互斥锁,因此它是可见的,可以在其他进程中打开.Windows在句柄上使用简单的引用计数.如果您没有自己Dispose()它,那么终结器将为您关闭句柄.如果你的程序很难轰炸并且永远不会执行终结器,那么Windows将在清理程序使用的资源时执行此操作.

这将自动减少引用计数.如果减少到零(没有其他进程打开句柄),则释放内核对象.

换句话说:无论事情多么糟糕,你都没有问题.实际的突变对象存在于内核内存池中.您可以使用SysInternals的WinObj工具查看它.