想要的东西:跨进程同步,不遭受AbandonedMutexException
-
19-08-2019 - |
题
我的几个线程,获得互斥,然后终止。
的互斥都存储在一个主要仓库,并适当时释放程序的存在。然而,当线分配一个互斥的存在,互斥获得释放,并随后获得AbandonedMutexException(还根据 该文件).
我如何可以避免的这一例外,并继续使用互斥即使在分配线说完了吗?是否有另一个更合适的同步建造中。净,没有这种限制。
注意到 -我正在寻找一个交进程同步机制具有类似的语义互斥。
解决方案 2
看起来像的EventWaitHandle我想要做什么。它有一个构造函数的名称,所以它是完美的跨进程同步,它不存在这个问题。
其他提示
回答的问题
据我所知没有这样的互斥的类。该AbandonedMutexException是很令人讨厌,但它表示一个现实情况可能发生的没有自动解决方案。
当你跨进程,或甚至跨线通信,必须处理的事实,任何一个参与实体可以的意外突然终止的任何数量的原因。互斥的存在是为了保护资源,如果一个线程被放弃,同时它拥有一个互斥是没有办法为操作系统,以保证它左数据中的任何一致的方式。这是非常重要的,因为它意味着放弃线可能已经失效的某些变量是取决于其他线。
该AbandonedMutexException是一种积极主动地说"不好的事情发生了,你现在是在一个不确定的状态"。实在是没有其他recoures的操作系统在这里。
响应你的答案
安全访问不同的是,互斥和提供不同的目的。
互斥是用来保护特定资源多样一个锁的发言。当一个特定的线获取互斥是说自己的互斥。只能有一个老板的时间。因此,如果所有的线所涉及的同意只摸一资源时,他们拥有所有权的互斥的,你可以放心地取一种资源跨越线。s
安全访问可以visualed,在一定程度,作为一线的安全事件。它具有该概念暗示和unsignaled和任何数量的线可以等待它打一个信号的状态。当它发出一个等待线将被唤醒,并将开始处理。
你可以使用一个安全访问来实现的一种形式线的安全。而不是锁定的所有权是关键访问的资源,正在发出信号,从事件的关键是访问的资源。但是,魔鬼再次在细节。
- 谁是负责的信的事件吗?与互斥,每一个线程基本上是叫"我,我,我"操作系统挑选一个线来赢得。与安全访问,你将负责决定在下一个线程得到去。
- 会发生什么当别人杀害一个过程,通过taskmgr?如果有什么过程中杀害了一线目前应对的一个事件上的安全访问?
2但是,什么时候会发生的项目谁得到的信号等待处理的下一个取下来?你必须考虑到这一点,以避免僵局。
没有什么阻止您使用接收AbandonedMutexException
后的互斥。从 DOC :
在下一线程请求互斥的所有权可以处理此 异常并进行,前提是数据的完整性 结构可以被验证。
当然,这是假设你的知道的你(和你的线程)正在做什么,而他们崩溃,这基本上意味着获取线程也可以同样在退出之前释放互斥锁。
所以最终自己使用EvenWaitHandle
的解决方案比互斥一个更好的。