2

CreateMutexで作成されWaitForSingleObjectたミューテックスがあり、ミューテックスが解放されて所有権を取得するまで(タイムアウトなしで)スレッドで待機していました。

そのため、関数が を返した場合はWAIT_OBJECT_0、結婚してスレッドのコードを実行できます。

ただし、関数がWAIT_ABANDONEDを返した場合でも、Mutex で呼び出している他のスレッドがWaitForSingleObject解放されるまでスタックすることを期待して、コードを実行できますか?


所有しているスレッドが Mutex を解放せずに終了した場合に備えて、呼び出し元のスレッドが所有権を取得し、通常どおり処理を続行する必要があります。


編集: 私が混乱しているのは、(2) がシグナルされている状態 (1) とは対照的に、シグナルされていない場合のミューテックスの状態を MSDN が述べていることです。それは私にとって何を意味しますか?

4

2 に答える 2

1

戻った場合WAIT_ABANDONED、それはあなたがミューテックスの所有権を取得したことを意味します。問題は、それによって保護されているリソースの状態がわからないことです。

たとえば、スレッドXがミューテックスを取得し、そのミューテックスによって保護されているものの状態の操作を開始してから、強制終了されたとします。状態は不明であり、ミューテックスは保持されていません。そのミューテックスを待ちに行くと、それを受け取りますが、その状態はわかりません。

于 2012-08-09T17:52:29.807 に答える
1

WAIT_ABANDONED を取得することは、コードにかなり重大な問題があることを示しています。このステータス コードは、スレッドがミューテックスを所有しているが、ReleaseMutex() を呼び出さずに終了した場合に発生します。

その関数を呼び出すのを忘れただけで、コードの単純な間違いである可能性があります。それは本当に厄介な何かの兆候である可能性があります.スレッドは例外で死んでしまい、それを飲み込みました. しかし、ミューテックスの解放を忘れるなど、状態を適切にクリーンアップしませんでした。クリーンアップせずに例外を飲み込むことは、常に厄介なバグ ジェネレーターとなり、プログラムを予測不能かつ診断不能に失敗させます。

于 2012-08-09T18:08:06.313 に答える