gpt4 book ai didi

.net - 通缉 : Cross-process synch that doesn't suffer from AbandonedMutexException

转载 作者:可可西里 更新时间:2023-11-01 14:44:41 25 4
gpt4 key购买 nike

我有几个线程获取互斥量然后终止。

互斥量存储在主存储库中,并在程序存在时适当释放。但是,当分配互斥量的线程存在时,互斥量会自动释放,并随后获取 AbandonedMutexException(同样根据 the documentation )。

我怎样才能避免这个异常,并在分配线程完成后继续使用 Mutex? .Net 中是否有另一个更合适的同步结构没有此限制。

注意 - 我正在寻找一种与 Mutex 具有相似语义的跨进程同步机制。

最佳答案

对问题的回应

据我所知,不存在这样的 Mutex 类。 AbandonedMutexException 非常烦人,但它代表了可能发生的没有自动解决方案的真实情况。

当您进行跨进程甚至跨线程通信时,您必须处理这样一个事实,即任何一个参与实体都可能由于多种原因而意外和突然终止。互斥体的存在是为了保护资源,如果一个线程在持有互斥体时被放弃,操作系统就无法保证它以任何一致的方式留下数据。这非常重要,因为这意味着放弃线程可能会使其他线程所依赖的某些不变量失效。

AbandonedMutexException 是一种主动说“坏事发生了,你现在处于不确定状态”的方式。这里真的没有操作系统的其他资源。

对您的回答的回应

EventWaitHandle 与 Mutex 不同,用途不同。

Mutex 用于保护特定资源,就像锁定语句一样。当一个特定的线程获得一个互斥锁时,它就被称为拥有这个互斥锁。一次只能有一个所有者。因此,如果所有涉及的线程都同意仅在拥有 Mutex 所有权时才接触资源,则您可以安全地跨线程访问资源。

EventWaitHandle 在某种程度上可以看作是一个线程安全事件。它有信号和非信号的概念,任何数量的线程都可以等待它达到信号状态。当它收到信号时,等待线程之一将被唤醒并开始处理。

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

  1. 谁负责发出事件信号?使用互斥锁,每个线程基本上都在尖叫“我我我”,操作系统选择一个线程获胜。使用 EventWaitHandle,您将负责决定下一个线程何时开始。
  2. 当有人通过 taskmgr 终止进程时会发生什么?如果被杀死的进程当前有一个线程正在响应 EventWaitHandle 上的事件怎么办?
  3. 2 但是当下一个发出等待句柄信号的项目被取下时会发生什么?您必须考虑到这一点以避免死锁。

关于.net - 通缉 : Cross-process synch that doesn't suffer from AbandonedMutexException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/654166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com