微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

Mutex mutex = new Mutex(false,"MyMutexName"); if (!mutex.WaitOne(1)) return; try{ //do stuff } catch{ //exceptions} finally { mutex.ReleaseMutex(); }

我的问题是,如果在程序结束时忘记释放它,那么互斥体到底发生了什么? 在某些窗口控制面板组件中是否可见? 它在哪里生活?

从WPF窗口应用程序中使用具有集成身份validation的WebService

检查Windows用户或组是否存在,支持域名

如何删除文件关联

将键码转换为相关的显示字符

无法以recursion方式删除用户文件夹中的文件夹。 在mscorlib.dll中发生“System.UnauthorizedAccessException”

它是一个有名的互斥体,所以它是可见的,可以在其他进程中打开。 Windows在句柄上使用简单的引用计数。 如果你不自己dispose(),那么finalizer会为你关闭句柄。 如果你的程序炸弹很难,永远不会执行终结器,那么当它清理你的程序使用的资源时,Windows将会执行它。

这会自动减少引用计数。 如果这个值减小到零(没有其他进程打开句柄),那么内核对象被释放。

换句话说,不管事情多么糟糕,你都没有问题。 实际的突变对象存在于内核内存池中。 你可以用SysInternals的WinObj工具看到它。

来自MSDN

如果一个线程在拥有一个互斥体的时候终止了,那么这个互斥体被认为是被放弃了。 互斥状态设置为发信号,下一个等待线程获得所有权。 如果没有人拥有该互斥体,则互斥体的状态被发信号通知。 从.NET Framework 2.0版开始,在下一个获取互斥锁的线程中抛出AbandonedMutexException异常。 在.NET Framework 2.0之前,不会引发异常。

警告

一个被遗弃的互斥体经常表示代码中有严重的错误。 当线程退出而不释放互斥锁时,由互斥锁保护的数据结构可能不会处于一致状态。 如果可以验证数据结构的完整性,则下一个请求拥有互斥锁的线程可以处理此异常并继续。

在全系统互斥体的情况下,被遗弃的互斥体可能会指示应用程序突然终止(例如,通过使用Windows任务管理器)。

互斥是OS级别的句柄。 当你的流程结束时,他们将会关闭(如果你没有尽早关闭它们,那就是)

编辑

好的,我明显误解了这个例子和问题。 如果你只是试图检测是否存在另一个实例,你会创建一个有名的互斥体(或类似的对象),只需检查它的存在,而不会锁定它。

对WaitOne锁定它,取得所有权,而ReleaseMutex则将其清除(只要没有对WaitOne额外WaitOne )。 如果您在完全释放互斥体的情况下结束了线程,则会使对象处于不良状态,正如Micah引用的文本中所述。

我把你的问题当作关于是否在进程完成之前关闭句柄 ,这完全是另一回事。

额外

在SDK [API] [1]级别,如果已经创建了一个相同名称的互斥体,则可以调用CreateMutex以期望失败。 在.NET中(至少在4.0中),有一个[构造函数] [2]填充了一个creatednew bool。

[1]: http : //msdn.microsoft.com/en-us/library/ms682411( VS.85) .aspx CreateMutex

[2]: http : //msdn.microsoft.com/en-us/library/bwe34f1k( v=VS.90) .aspx Mutex

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐