c# - c# Mutex 死锁
问题描述
我们有以下代码:
public static Mutex AcquireMutex(string name)
{
bool ndgMutexAcquired;
Mutex ndgMutex = new Mutex(true, name, out ndgMutexAcquired);
if (!ndgMutexAcquired)
{
try
{
ndgMutex.WaitOne();
}
catch (AbandonedMutexException)
{
}
}
return ndgMutex;
}
我有一个父进程,在任务中,我调用 AcquireMutex,运行一些代码,然后释放它。在另一个任务中,我调用了一个子进程,该子进程也调用了同名的 AcquireMutex,然后立即调用 release。看来这是陷入僵局了。我认为唯一的事情是“最初拥有”参数可能需要为 false,如下所示:
public static Mutex AcquireMutex(string name)
{
Mutex ndgMutex = new Mutex(false, name);
try
{
ndgMutex.WaitOne();
}
catch (AbandonedMutexException)
{
}
return ndgMutex;
}
我真的不明白为什么这会有所帮助,但它似乎。谁能帮我理解为什么这可能会死锁以及正确的解决方法是什么?
这是在子进程中调用 Acquire mutex 的代码
using (var mutex = MutexExtensions.AcquireMutex(@"Global\auth_mutex"))
{
LogHelper.LogInfo("Releasing mutex since it was successfully acquired");
mutex.ReleaseMutex();
}
在父进程中:
return Task.Run(() =>
{
Logger.LogInfo("Acquiring mutex ...");
using (var mutex = MutexExtensions.AcquireMutex(@"Global\auth_mutex"))
{
Logger.LogInfo("Auth mutex acquired");
// Stuff done here (external process call) ~~~~~~~~~~~~
// Mutex.Dispose doesn't implicitly release the mutex
Logger.LogInfo("Releasing mutex");
mutex.ReleaseMutex();
return new TaskResult(true);
}
});
解决方案
推荐阅读
- java - 当我打开应用程序时,Android TimerTask 关闭
- networking - 限制 OpenVPN 服务器只能通过域名而不是浏览器上的服务器 IP 访问
- bots - 如何进行命令冷却?
- css - 防止在 SVG 颜色渐变动画结束时捕捉
- docker - 有没有可能在 distroless 映像中安装 bash?
- lua - 有没有像“awful.client.focus.global_byidx()”这样的东西?
- react-native-android - React Native Auto Linking of dependencies 问题
- python - 将授权码传递给 Python Notebook
- d3.js - 如何将原始数据行检索到 dc.js 箱线图数据点?
- android - 如何在 Spinner 中获取值并将值传递给 url 进行翻译