0

適切なスレッド終了のためWait Functions に (WaitForSingleObject、WaitForMultipleObject など)を使用することにしました。この場合、問題は、メモリ リークを回避するためにCloseHandle (スレッド ハンドル) を明示的に呼び出す必要があるか、それとも待機関数が独自にハンドルをクリーンアップして閉じる必要があるかということです。明示的に呼び出す必要がある場合、 「 CreateThread (同じスレッド ハンドル) 」を再度呼び出すことができますか? GetExitCodeThread() を再度呼び出すことができますか?CloseHandle

注: 1 つのStackOverFlowの質問に答えてくれました。

4

1 に答える 1

4

メモリ リークを回避するには、 を呼び出す必要がありますCloseHandleGetExitCodeThreadまたはなどの関数WaitForSingleObjectを aHANDLEが閉じられた後に使用すると、未定義の動作が発生します。うまくいく場合もありますが、クラッシュしたり、間違った答えを返す場合もあります。自分自身を妨害する: ハンドルを閉じてから使用するで説明されているように

無効なパラメーターが指定されたときに WaitForSingleObject が WAIT_FAILED を返すことは事実ですが、ハンドルのリサイクルは、無効なハンドルが突然再び有効になる可能性があることを意味します (ただし、無関係なオブジェクトを参照します)。

そのため、通常は次のようにするのが最善です。

CloseHandle(handle);
handle = INVALID_HANDLE_VALUE;

これは、ハンドルを使用しようとすると、適切なエラー コードで失敗することを意味します。

ハンドルを適切にクリーンアップしたら、それを使用して別のスレッドを作成しても安全です。

handle = CreateThread(...);

これは新しいスレッドに割り当てられたハンドルになりGetExitCodeThread、 で最終的なクリーンアップを行うまで再度呼び出すことができますCloseHandle

于 2013-01-08T18:14:45.573 に答える