2013-03-17 112 views
12

次のコードを使用して、実行中の複数のプロセス間で共有リソースへの排他的アクセスを同期させます。AbandonedMutexExceptionから正常に抜け出すには?

ミューテックスのような作成された:それを残すために

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

このコード:

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

は、その後、私は相互に排他的なセクションを入力するために、このメソッドを使用

public bool leaveMutuallyExclusiveSection() 
{ 
    //RETURN: = 'true' if no error 
    bool bRes = true; 

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

    return bRes; 
} 

しかし、実行中のプロセスの1つがクラッシュした場合、またはタスクマネージャから終了した場合、ミュートxはAbandonedMutexException例外を返します。だから私の質問は、それから抜け出すための優雅な方法は何ですか?

これは正常に動作するようです:

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

しかし、私はその場合には、相互に排他的なセクションを入力することができますか?

誰かが明確にできるか?

答えて

22

MSDNによればAbandonedMutexExceptionがある:

あるスレッドが別のスレッドがそれを解放せずに出ることによって放棄たミューテックスオブジェクト を取得した場合にスローされる例外。

これは、この例外がスローされたスレッドが(あなたがやっているようにそれ以外の場合はMutex.ReleaseMutex Methodを呼び出すとApplicationExceptionを誘発するだろう)Mutexの新しい所有者であることを意味し、あなたがデータの整合性を確保することができる場合mutexによって保護されている構造体は例外を無視してアプリケーションを正常に実行し続けることができます。

はしかし、AbandonedMutexExceptionは、ミューテックスで保護されたデータ構造の整合性を提起している時間のほとんどは保証できませんし、この例外は、.NETフレームワークのバージョン2.0で導入された理由です:

放棄されたミューテックスは深刻なプログラミングエラーを示します。 スレッドがmutexを解放せずに終了すると、mutexで保護されたデータ構造 は一貫性のない状態になる可能性があります。 .NET Framework 2.0以前では、 の結果として待機が完了した場合に例外がスローされなかったため、このような問題は検出されにくいでした。

+0

ご存じのように、私は試してみましたが、例外はありません。それでも、mtx.WaitOne()をもう一度呼びますか? – c00000fd

+1

いいえ、** WaitOne **を呼び出す必要はありません。** Mutex **は** AbandonedMutexException **を捕捉したスレッドによって既に獲得されているからです。 –

+0

よろしくお願いいたします。 – c00000fd

関連する問題