2012-03-26 12 views
1

まず、テストしたところ、うまくいきました。 正しいかどうかを知りたい。win32でMutexをリリースせずに "スロー"を使用するのは安全ですか?

funcA() { 
    DWORD res = WaitForSingleObject(mutex, INFINITE); 
    if (aaa != bbb) throw "aaa"; 

    ReleaseMutex(mutex); 
} 

WaitForSingleObjectは常に「WAIT_ABANDONED」またはその他のエラーコードではなく「0」を返します。 Mutexが「スロー」でリリースされることを説明するドキュメントは見つかりません。

ありがとうございます

+0

同じスレッドからfuncA()を呼び出すと、それは予想される動作です.WAIT_OBJECT_0が返されます。これは、Windowsのmutexが再帰的であるためです。 2回目に別のスレッドからfuncA()を呼び出すと、最初のスレッドがmutexを解放するまで呼び出しをブロックすると思います。 –

+0

あなたは正しいです。私はxmlrpcライブラリを使用していると私は、要求を処理するための複数のスレッドがあると思ったが、唯一のスレッドがあります。だから、それは期待された動作であり、私のミューテックスは不要です! :) – Sean

答えて

1

いいえ、ミューテックスはスローでリリースされません。

しかし、コンストラクタ上でmutexをロックする独自のLockクラスを構築し、それをデストラクタで解放することはできます。次に、(ヒープではなくメモリスタックを使用して)関数内でLockオブジェクトを使用する場合は、そのオブジェクトのデストラクタが呼び出され、ミューテックスが解放されていることを確認できます。

これは、正確にはMFCのCSingleLockクラスの機能です。

+1

また、ATLのCComAutoCriticalSectionとCComCriticalSectionLock。 – selbie

1

リリースが暗黙のうちにデストラクタまたはキャッチブロックに呼び出されない限り、それはできません。それを記述するために必要なコード全体を表示していますか?

関連する問題