- ベストアンサー
CloseHandle()
スレッドを、同じハンドルを利用して作る場合、 途中でハンドルの開放が必要か教えてください。 void thread1(); HANDLE handle; //スレッド作成 handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread1, NULL, 0, &dwID); //作ったスレッドの終了を待つ WaitForMultipleObjects(1, handle, TRUE, INFINITE); //スレッドを作った時のハンドルを閉じる。これ必要? CloseHandle(handle); //同じハンドルを利用して別のスレッドであるthread2を作成 handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread2, NULL, 0, &dwID); この、CloseHandle(handle);は必要ですか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ハンドルは、Windowsがリソースを管理するために付ける数値です。 質問中で、 HANDLE handle; として、ハンドル型の変数を定義していますが、この「handle」自体はハンドルではなく、CreateThread()からの戻り値がハンドルです。 一度、 handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread1, NULL, 0, &dwID); を実行した後、 handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread2, NULL, 0, &dwID); としても、同じハンドル変数を使用していますが、同じハンドルを使用しているわけではありません。 1度目のCreateThread()も、2回目のCreateThread()も新たにWindowsから取得したハンドルを返すからです。 ハンドルは、使用後、閉じる必要がありますので、 CloseHandle(handle); は必要です。
その他の回答 (2)
CreateThread で作成したスレッドのハンドルだから、ExitThread すれば、ハンドルはクローズされ、handle の値が無効になるような気にもなりますが、 WaitForMultipleObjects を呼び出している事からもわかるように、スレッドが終了してもハンドルそのものは必用になる事があるので、ハンドルが自動的にクローズされる事はありません。 よって、CloseHandle(handle); は必要です。 ちなみに、WaitForMultipleObjects の2つ目の引数は、HANDLE へのポインタです。
お礼
質問文で、 void thread1(); の下に書くつもりの void thread2(); が抜けていました。 それから、WaitForMultipleObjects の2つ目の引数を 間違えていました。HANDLE配列へのポインタなんですね。 つまり、 HANDLE handle; は HANDLE handle[1]; と書くべきで、それ以降も書き直しました。 ありがとうございます。 どうして、閉じなくてもいいかもしれないと思ったかというと handleというのを1つの形のある物のようなものだと思っていました。 CloseHandle(handle);して、またすぐにhandleが使われるなら CloseHandle(handle);の意味がないかもしれないと思っていました。
- bug_master
- ベストアンサー率52% (10/19)
結論から言うと必要ですが、 そのプログラムだと、単に変数の使い回しをしているだけで、 同じハンドルなどそもそも使ってなどいないのですが? void *p; p = malloc(...);//一回目 p = malloc(...);//二回目 で二回目のmallocは同じポインタを利用するのでfreeは要らないなんて思ってませんよね?
お礼
ありがとうございます。 「handle」自体はハンドルではないんですね。 CreateThread()が返した値によって、handdleに1234が 代入されたとしたら、そのスレッド関係のものを 全て開放するには、スレッドが終了して、1234という 値が格納されたHANDLE型の変数をCloseHandle()の引数に入れて、 1234という数字で登録されているハンドルを開放する必要が あったんですね。