如何优雅地摆脱AbandonedMutexException

本文关键字:AbandonedMutexException 何优雅 | 更新日期: 2023-09-27 18:04:10

我使用下面的代码来同步几个正在运行的进程对共享资源的互斥访问。

互斥锁是这样创建的:

Mutex mtx = new Mutex(false, "MyNamedMutexName");

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

public bool enterMutuallyExclusiveSection()
{
    //RETURN: 'true' if entered OK, 
    //         can continue with mutually exclusive section
    bool bRes;
    try
    {
        bRes = mtx.WaitOne();
    }
    catch (AbandonedMutexException)
    {
        //Abandoned mutex, how to handle it?
        //bRes = ?
    }
    catch
    {
        //Some other error
        bRes = false;
    }
    return bRes;
}

和下面的代码:

public bool leaveMutuallyExclusiveSection()
{
    //RETURN: = 'true' if no error
    bool bRes = true;
    try
    {
        mtx.ReleaseMutex();
    }
    catch
    {
        //Failed
        bRes = false;
    }
    return bRes;
}

但是,如果其中一个正在运行的进程崩溃,或者如果它从任务管理器终止,互斥锁可能会返回AbandonedMutexException异常。所以我的问题是,怎样才能优雅地摆脱困境?

这似乎工作良好:

    catch (AbandonedMutexException)
    {
        //Abandoned mutex
        mtx.ReleaseMutex();
        bRes = mtx.WaitOne();    
    }

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

有人能解释一下吗?

如何优雅地摆脱AbandonedMutexException

根据MSDN, AbandonedMutexException是:

当一个线程获取互斥对象时引发的异常另一个线程已经退出而没有释放它。

这意味着抛出此异常的线程是互斥锁的新所有者(否则调用互斥锁)。ReleaseMutex方法(就像你正在做的那样)会触发ApplicationException),如果你能确保互斥锁保护的数据结构的完整性,你可以简单地忽略异常并继续正常执行你的应用程序。

然而,大多数时候抛出AbandonedMutexException时,受互斥锁保护的数据结构的完整性无法得到保证,这就是为什么这个异常在。net框架的2.0版本中引入的原因:

一个废弃的互斥锁表示一个严重的编程错误。当一个线程在没有释放互斥锁(数据结构)的情况下退出受互斥锁保护的数据可能不处于一致状态。之前在。net框架的2.0版本中,这样的问题很难被发现因为如果执行的结果完成了等待,则不会引发异常一个废弃的互斥锁。

相关文章:
  • 没有找到相关文章