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工具查看它.