プロが教えるわが家の防犯対策術!

windowsのスレッドについての質問です。
今、手元にある書籍のスレッドを作る節にCreateThread()関数を使ってスレッドを作るサンプルプログラムが載っています。
その中では CloseHandle()関数が一切呼ばれていません。
しかも、そのサンプルではいくつもスレッドを作り、そのスレッドはプログラム中でいくつも終了するようなものです。CloseHandle()は呼び出さなくても問題ないのでしょうか?
しかし、ネットで調べてみるとCloseHandle()を呼び出さなくてはいけないということが書かれていました。
http://www.daccho-it.com/program/WinApi/thread.htm

参考にしたサイト
そこでいくつか質問です。
プロセスが終了するときにスレッドのハンドルは自動的に閉じられるという認識で大丈夫でしょうか?
CreateThread()、_beginthreadex関数はCloseHandle()を呼び出す必要があるで大丈夫でしょうか?
となると、CreateThread()の戻り値は必ず変数に保存しておく必要があるということですか?
書籍のサンプルではCreateThread()の戻り値はどこにも保存していませんでした、保存しない場合ハンドルが作られないってことはさすがにないですよね?
よろしくお願いします。

A 回答 (1件)

まず、プロセスが終了するときにはスレッドハンドルに限らずプロセスが所有する全てのハンドルが閉じられますので、それは大丈夫です。



次にハンドルは原則として閉じる必要があります。基本的にハンドルが必要なければ受け取ってすぐに閉じて良いです。ただ受け取らずに放置しても少しメモリが無駄になるだけですので、長時間動かして多数のスレッドを作るプログラム以外では放置しても実害は少ないです。

余談ですが、Excel VBAではハンドルを閉じるタイミングに注意が必要でした。Excel VBAでCreateThreadを使ったときはスレッド終了前にCloseHandleしたらExcelが応答しなくなりました。
# たぶんExcel内で同じハンドルを保持して使っているのだと思う
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
参考になります。
プロセスが終了するときに全て閉じられるのならそれほど気にしなくても大丈夫なんですね。

お礼日時:2009/12/19 20:56

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