19

次のコードを使用して、実行中の複数のプロセス間で共有リソースへの相互に排他的なアクセスを同期します。

ミューテックスは次のように作成されます。

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しかし、実行中のプロセスの1つがクラッシュした場合、またはタスクマネージャーから終了した場合、ミューテックスは例外を返す可能性があります。だから私の質問は、それから抜け出すための優雅な方法は何ですか?

これはうまくいくようです:

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

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

誰かが明確にすることができますか?

4

1 に答える 1

30

MSDN によると、AbandonedMutexExceptionは次のとおりです。

あるスレッドが、別のスレッドが解放せずに終了して放棄した Mutex オブジェクトを取得したときにスローされる例外。

これは、この例外がスローされたスレッドがMutexの新しい所有者であることを意味します(そうしないと、あなたが行っているようにMutex.ReleaseMutex メソッドを呼び出すとApplicationExceptionがトリガーされます)、によって保護されたデータ構造の整合性を保証できる場合ミューテックスを使用すると、例外を無視して、アプリケーションを通常どおり実行し続けることができます。

ただし、ほとんどの場合、AbandonedMutexException が発生し、ミューテックスによって保護されたデータ構造の整合性が保証されないため、この例外が .NET フレームワークのバージョン 2.0 で導入されました。

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

于 2013-03-17T04:37:58.753 に答える