我的几个线程,获得互斥,然后终止。

的互斥都存储在一个主要仓库,并适当时释放程序的存在。然而,当线分配一个互斥的存在,互斥获得释放,并随后获得AbandonedMutexException(还根据 该文件).

我如何可以避免的这一例外,并继续使用互斥即使在分配线说完了吗?是否有另一个更合适的同步建造中。净,没有这种限制。

注意到 -我正在寻找一个交进程同步机制具有类似的语义互斥。

有帮助吗?

解决方案 2

看起来像的EventWaitHandle我想要做什么。它有一个构造函数的名称,所以它是完美的跨进程同步,它不存在这个问题。

其他提示

回答的问题

据我所知没有这样的互斥的类。该AbandonedMutexException是很令人讨厌,但它表示一个现实情况可能发生的没有自动解决方案。

当你跨进程,或甚至跨线通信,必须处理的事实,任何一个参与实体可以的意外突然终止的任何数量的原因。互斥的存在是为了保护资源,如果一个线程被放弃,同时它拥有一个互斥是没有办法为操作系统,以保证它左数据中的任何一致的方式。这是非常重要的,因为它意味着放弃线可能已经失效的某些变量是取决于其他线。

该AbandonedMutexException是一种积极主动地说"不好的事情发生了,你现在是在一个不确定的状态"。实在是没有其他recoures的操作系统在这里。

响应你的答案

安全访问不同的是,互斥和提供不同的目的。

互斥是用来保护特定资源多样一个锁的发言。当一个特定的线获取互斥是说自己的互斥。只能有一个老板的时间。因此,如果所有的线所涉及的同意只摸一资源时,他们拥有所有权的互斥的,你可以放心地取一种资源跨越线。s

安全访问可以visualed,在一定程度,作为一线的安全事件。它具有该概念暗示和unsignaled和任何数量的线可以等待它打一个信号的状态。当它发出一个等待线将被唤醒,并将开始处理。

你可以使用一个安全访问来实现的一种形式线的安全。而不是锁定的所有权是关键访问的资源,正在发出信号,从事件的关键是访问的资源。但是,魔鬼再次在细节。

  1. 谁是负责的信的事件吗?与互斥,每一个线程基本上是叫"我,我,我"操作系统挑选一个线来赢得。与安全访问,你将负责决定在下一个线程得到去。
  2. 会发生什么当别人杀害一个过程,通过taskmgr?如果有什么过程中杀害了一线目前应对的一个事件上的安全访问?
  3. 2但是,什么时候会发生的项目谁得到的信号等待处理的下一个取下来?你必须考虑到这一点,以避免僵局。

没有什么阻止您使用接收AbandonedMutexException后的互斥。从 DOC

  

在下一线程请求互斥的所有权可以处理此   异常并进行,前提是数据的完整性   结构可以被验证。

当然,这是假设你的知道的你(和你的线程)正在做什么,而他们崩溃,这基本上意味着获取线程也可以同样在退出之前释放互斥锁。

所以最终自己使用EvenWaitHandle的解决方案比互斥一个更好的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top