dポイントプレゼントキャンペーン実施中!

スレッドを、同じハンドルを利用して作る場合、
途中でハンドルの開放が必要か教えてください。


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);は必要ですか?

A 回答 (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);
は必要です。
    • good
    • 0
この回答へのお礼

ありがとうございます。
「handle」自体はハンドルではないんですね。
CreateThread()が返した値によって、handdleに1234が
代入されたとしたら、そのスレッド関係のものを
全て開放するには、スレッドが終了して、1234という
値が格納されたHANDLE型の変数をCloseHandle()の引数に入れて、
1234という数字で登録されているハンドルを開放する必要が
あったんですね。

お礼日時:2002/08/29 21:21

CreateThread で作成したスレッドのハンドルだから、ExitThread すれば、ハンドルはクローズされ、handle の値が無効になるような気にもなりますが、


WaitForMultipleObjects を呼び出している事からもわかるように、スレッドが終了してもハンドルそのものは必用になる事があるので、ハンドルが自動的にクローズされる事はありません。

よって、CloseHandle(handle); は必要です。

ちなみに、WaitForMultipleObjects の2つ目の引数は、HANDLE へのポインタです。
    • good
    • 0
この回答へのお礼

質問文で、
void thread1();
の下に書くつもりの
void thread2();
が抜けていました。
それから、WaitForMultipleObjects の2つ目の引数を
間違えていました。HANDLE配列へのポインタなんですね。
つまり、
HANDLE handle;

HANDLE handle[1];
と書くべきで、それ以降も書き直しました。

ありがとうございます。
どうして、閉じなくてもいいかもしれないと思ったかというと
handleというのを1つの形のある物のようなものだと思っていました。
CloseHandle(handle);して、またすぐにhandleが使われるなら
CloseHandle(handle);の意味がないかもしれないと思っていました。

お礼日時:2002/08/29 21:20

結論から言うと必要ですが、


そのプログラムだと、単に変数の使い回しをしているだけで、
同じハンドルなどそもそも使ってなどいないのですが?

void *p;
p = malloc(...);//一回目
p = malloc(...);//二回目
で二回目のmallocは同じポインタを利用するのでfreeは要らないなんて思ってませんよね?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A