如何优雅地摆脱AbandonedMutexException?

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

互斥锁是这样创建的:

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; } 

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

这似乎工作正常:

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

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

有人可以澄清吗?

根据MSDN, AbandonedMutexException是:

当一个线程通过退出而不释放它而获取另一个线程已放弃的Mutex对象时引发的exception。

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

但是,大多数情况下引发了AbandonedMutexException,无法保证受互斥锁保护的数据结构的完整性,这就是为什么在.NET框架的2.0版本中引入了此exception的原因:

废弃的互斥锁表示严重的编程错误。 当线程退出但未释放互斥锁时,受互斥锁保护的数据结构可能不处于一致状态。 在.NET Framework 2.0版之前,很难发现这样的问题,因为如果由于废弃的互斥锁导致等待完成,则不会抛出任何exception。

Interesting Posts