首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何优雅地走出AbandonedMutexException?

如何优雅地走出AbandonedMutexException?
EN

Stack Overflow用户
提问于 2013-03-17 10:50:50
回答 1查看 13.3K关注 0票数 19

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

互斥对象是这样创建的:

代码语言:javascript
运行
复制
Mutex mtx = new Mutex(false, "MyNamedMutexName");

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

代码语言:javascript
运行
复制
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;
}

并使用下面的代码离开它:

代码语言:javascript
运行
复制
public bool leaveMutuallyExclusiveSection()
{
    //RETURN: = 'true' if no error
    bool bRes = true;

    try
    {
        mtx.ReleaseMutex();
    }
    catch
    {
        //Failed
        bRes = false;
    }

    return bRes;
}

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

这似乎工作得很好:

代码语言:javascript
运行
复制
    catch (AbandonedMutexException)
    {
        //Abandoned mutex
        mtx.ReleaseMutex();
        bRes = mtx.WaitOne();    
    }

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

有人能澄清一下吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-17 12:37:59

根据MSDN的说法,AbandonedMutexException是:

当一个线程获取一个互斥对象时抛出的异常,另一个线程通过退出而没有释放它而放弃了该对象。

这意味着抛出此异常的线程是Mutex的新所有者(否则,像这样调用Mutex.ReleaseMutex Method将触发ApplicationException),如果您能确保互斥锁保护的数据结构的完整性,则可以忽略该异常并继续正常执行应用程序。

然而,在大多数情况下,互斥锁所保护的数据结构的完整性是不能保证的,这就是为什么在.NET框架的2.0版中引入了这个异常:

被放弃的互斥表示一个严重的编程错误。当线程在没有释放互斥锁的情况下退出时,互斥锁保护的数据结构可能不处于一致状态。在.NET框架2.0版之前,这类问题很难发现,因为如果等待是由于被放弃的互斥而完成的,则不会抛出异常。

票数 30
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15456986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档