问题标签 [abandonedmutexexception]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
886 浏览

.net - 为什么命名 .NET 互斥体在处置时不抛出 AbandonedMutexException?

我不明白为什么 .NET 互斥锁不会在其中一个等待线程中抛出或在调用AbandonedMutexException时释放互斥锁。Mutex.Dispose()

特别是,像这样的代码会死锁:

请注意,我知道它AbandonedMutexException通常来自底层的 WIN32 互斥体,并且只有在拥有线程死亡的情况下才会触发本机代码 - 我已经编写 C/C++ 代码很长时间并且完全了解底层设计。我也知道以下代码是一个简单的解决方法:

我不明白的是,当对象在持有锁的同时被显式处理时,.NET 互斥锁不强制释放的基本原理。这不是更符合 .NET 编程范式的其余部分吗?如果/当开发人员显式销毁锁定的互斥锁时……只有将其标记为已放弃才有意义。

0 投票
2 回答
12629 浏览

c# - 放弃互斥异常

我第一次尝试使用互斥锁,并在程序的两个单独实例上执行以下代码

当我运行它时,其中一个实例(我首先运行的那个)打印

另一个实例打印

并且一旦第一个实例租用互斥锁,它就会在第二个等待语句处崩溃,但异常

关于为什么我得到这个异常以及如何防止它的任何想法?

解决方案:我可能应该更清楚地阅读 mdsn 文档。感谢安德鲁为我指明了正确的方向

您可以使用 WaitHandle.WaitOne 方法来请求互斥体的所有权。拥有互斥锁的线程可以在对 WaitOne 的重复调用中请求相同的互斥锁,而不会阻塞其执行。但是,线程必须调用 ReleaseMutex 方法相同的次数才能释放互斥锁的所有权。Mutex 类强制执行线程标识,因此互斥锁只能由获取它的线程释放。

0 投票
1 回答
13539 浏览

c# - 如何优雅地摆脱 AbandonedMutexException?

我使用以下代码在多个正在运行的进程之间同步对共享资源的互斥访问。

互斥锁是这样创建的:

然后我用这个方法进入互斥部分:

这个代码离开它:

但是发生的情况是,如果正在运行的进程之一崩溃,或者如果它从任务管理器中终止,互斥锁可能会返回AbandonedMutexException异常。所以我的问题是,摆脱它的优雅方式是什么?

这似乎工作正常:

但是在这种情况下我可以进入互斥部分吗?

有人可以澄清吗?

0 投票
0 回答
319 浏览

windows - 进程崩溃时Windows自动释放互斥锁

我在windows的多进程中使用全局互斥锁,但是当所有者进程崩溃时,互斥锁不会释放,然后另一个进程调用WaitForSingleObject,它返回WAIT_ABANDONED,我应该怎么做才能让这个互斥锁释放,或者做一些其他的动作什么时候回来WAIT_ABANDONED

0 投票
1 回答
72 浏览

c# - C# 互斥量处理

我不确定如何处理互斥锁。我需要一个进程只运行一次,但如果由于某种原因它意外崩溃或关闭,我还需要重置废弃的互斥锁。

出于这个原因,我做了一个助手调用,试图获取一个超时的互斥锁(按名称标识)。如果获取互斥锁失败,则返回 NULL,否则返回将由方法调用者处理的互斥锁。如果互斥锁被放弃,我将重置它并将请求视为失败(不是代码被用于周期性过程的问题,如果锁定有时失败,那么该过程将恢复到下一次运行)。

我要问的是,是否有一些我没有考虑过的情况可能会导致我的问题

这里的代码:

这里我将如何使用上面的类。下面的代码用于定期过程(通过 Windows 调度程序调度),所以如果有时出现问题不是问题(下一次运行将完成工作),重要的想法是没有竞争条件或死锁