9

ReleaseMutex() Microsoft のドキュメントは、ミューテックスが既にロック解除されているときに誤って呼び出すとどうなるかについて沈黙しています。

詳細:

コンパイラにアクセスせずに Windows コードを修正しようとしています。

WinApi ミューテックスはすべて再帰的であり、参照カウントされることを認識しています。私がその機能を利用していた場合、余分なReleaseMutex()呼び出しによって参照カウンターが時期尚早にデクリメントされることは明らかです。

ただし、私が見ているコードはミューテックスを再帰的に使用していないため、参照カウントが「1」より大きくなることはありません。必要以上にミューテックスを解放します...どうなりますか?参照カウントは負になりますか? ゼロ (ロック解除) のままで、無視できるエラーを返すだけですか?

(当然、このコードはこれらの関数を呼び出すときに実際にエラーをチェックしません!)

4

1 に答える 1

8

peejayは、彼のコメントでReleaseMutex ドキュメントへの適切なリンクを提供しました。ドキュメントの次の行があなたの質問に答えると思います:

呼び出し元のスレッドがミューテックス オブジェクトを所有していない場合、ReleaseMutex 関数は失敗します。

明示的には言われていませんが、ミューテックスを解放すると (初めて)、呼び出し元のスレッドがミューテックス オブジェクトを所有しなくなると思います。したがって、2 番目の呼び出しは単純に失敗します。このような実装は、このタイプのエラーを簡単に検出できるため、理にかなっています (戻り値を確認するだけです)。

于 2009-09-29T15:09:32.650 に答える