【问题标题】:what happens to a mutex object if not released by parent applicaiton如果不被父应用程序释放,互斥对象会发生什么
【发布时间】:2012-10-23 10:11:34
【问题描述】:

我的应用程序中有一个命名互斥体。

 private Mutex TaskExitStatus = new Mutex(false, "TaskExit")

我在使用 TaskExitStatus.WaitOne() 的方法中获取互斥锁

如果我在退出应用程序时没有释放互斥锁,会发生什么?互斥锁会被安全处理吗?

更新 1: 在应用程序退出时未释放时,命名和未命名互斥体的行为是否相同?

更新 2 这是我从MSDN link读到的内容

使用 CloseHandle 函数关闭句柄。系统关闭 进程终止时自动处理句柄。互斥对象 当它的最后一个句柄被关闭时被销毁。

【问题讨论】:

  • 它发出一声​​巨响。放弃互斥异常。不要抓住它。

标签: c# multithreading mutex


【解决方案1】:

根据documentation,已废弃(不一定处置)

如果线程在拥有互斥锁时终止,则称该互斥锁被放弃

另外,请注意有关废弃互斥锁的警告:

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

【讨论】:

  • @Rockstart 是的,一个未命名的互斥锁本质上是一个“本地”互斥锁。因此,只能从同一进程内的线程访问。如果您的应用程序已退出,那么您的互斥体将被放弃,但是,在这种情况下您应该没问题,因为无论如何其他线程都无法访问它。如果可以的话,你应该尝试更优雅地释放它......
【解决方案2】:

互斥锁的目的是保持一个锁(用于跨应用程序的命名互斥锁)直到它被释放。如果您不释放 Mutex,则应在资源上保持锁定,直到计算机重新启动。

【讨论】:

  • 请忽略——詹姆斯是对的。我在想一个命名的 Mutex 是不同的,但事实并非如此。唯一的区别是在命名 Mutex 的情况下,下一个获取锁的线程会抛出异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
  • 2014-11-24
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
  • 1970-01-01
相关资源
最近更新 更多