我使用以下代码在几个正在运行的进程之间同步对共享资源的互斥访问。
互斥对象是这样创建的:
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();
}
但在这种情况下,我可以进入互斥部分吗?
有人能澄清一下吗?
发布于 2013-03-17 12:37:59
根据MSDN的说法,AbandonedMutexException是:
当一个线程获取一个互斥对象时抛出的异常,另一个线程通过退出而没有释放它而放弃了该对象。
这意味着抛出此异常的线程是Mutex的新所有者(否则,像这样调用Mutex.ReleaseMutex Method将触发ApplicationException),如果您能确保互斥锁保护的数据结构的完整性,则可以忽略该异常并继续正常执行应用程序。
然而,在大多数情况下,互斥锁所保护的数据结构的完整性是不能保证的,这就是为什么在.NET框架的2.0版中引入了这个异常:
被放弃的互斥表示一个严重的编程错误。当线程在没有释放互斥锁的情况下退出时,互斥锁保护的数据结构可能不处于一致状态。在.NET框架2.0版之前,这类问题很难发现,因为如果等待是由于被放弃的互斥而完成的,则不会抛出异常。
https://stackoverflow.com/questions/15456986
复制相似问题