![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
スレッドを、同じハンドルを利用して作る場合、
途中でハンドルの開放が必要か教えてください。
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);は必要ですか?
No.2ベストアンサー
- 回答日時:
ハンドルは、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);
は必要です。
ありがとうございます。
「handle」自体はハンドルではないんですね。
CreateThread()が返した値によって、handdleに1234が
代入されたとしたら、そのスレッド関係のものを
全て開放するには、スレッドが終了して、1234という
値が格納されたHANDLE型の変数をCloseHandle()の引数に入れて、
1234という数字で登録されているハンドルを開放する必要が
あったんですね。
No.3
- 回答日時:
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);の意味がないかもしれないと思っていました。
No.1
- 回答日時:
結論から言うと必要ですが、
そのプログラムだと、単に変数の使い回しをしているだけで、
同じハンドルなどそもそも使ってなどいないのですが?
void *p;
p = malloc(...);//一回目
p = malloc(...);//二回目
で二回目のmallocは同じポインタを利用するのでfreeは要らないなんて思ってませんよね?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- 英語 The incidence of this complication is quite low, m 1 2023/06/04 13:14
- PHP isset — 変数が宣言されていること、そして null とは異なることを検査 1 2022/03/27 17:34
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- C言語・C++・C# いまc言語を独学で勉強しているのですがいまいちわかりません。 https://monozukuri- 3 2023/07/06 18:59
- 英語 The vital bone formation in the two large repairs 3 2023/03/25 09:44
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
WaitForSingleObjectの使い方について
C言語・C++・C#
-
VC++スレッドの正しい終了のさせかた
C言語・C++・C#
-
(マルチスレッド)_beginthreadexに複数の引数を渡す
C言語・C++・C#
-
-
4
LINK : fatal error LNK1104について
C言語・C++・C#
-
5
非同期のプロセス間通信(パイプ)で全データ受信する
C言語・C++・C#
-
6
VBAでこんなことできますか?
PowerPoint(パワーポイント)
-
7
スレッドの終了の仕方
C言語・C++・C#
-
8
別アプリの起動、終了について
C言語・C++・C#
-
9
C言語で、メモリを解放しないで終わるプログラム
C言語・C++・C#
-
10
絶対パスの取得について
C言語・C++・C#
-
11
UpdateData( FALSE); による文字列データの表示更新(VC++6.0)
C言語・C++・C#
-
12
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
13
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
14
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
15
戻り値を返す関数の前に(void)を付ける
C言語・C++・C#
-
16
std::stringからLPCWSTR型への変換
C言語・C++・C#
-
17
ExitProcessの関数コールについて教えてください。
C言語・C++・C#
-
18
スレッドの安全な終了のさせ方
C言語・C++・C#
-
19
CEdit の内容が変わった時にメッセージを表示させたい
C言語・C++・C#
-
20
VC++ 2008 EXPRESS _T"識別子がみつかりません"
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
他のウィンドウのボタンを自動...
-
vbaから他のアプリを終了
-
VBA 複数セルが空白なら印刷さ...
-
デスクトップ上のアイコンの位...
-
SendMessage で ESC など
-
システム例外のメッセージを変...
-
点滅で知らせる方法
-
16進数入力制限方法
-
ElseIfの使い方。
-
マウスの状態の取得
-
マウスの右クリック+Shiftキー...
-
ウィンドウプロシージャの書き...
-
キーボード・フックのアプリを...
-
SetWindowText関数について
-
Buffer overrun, data ..
-
エクセルで作った新しいウイン...
-
グラフの交点の求め方(Excel)
-
Minecraft 統合版(PC)の描画距...
-
「アイテムは収集されました」...
-
コントロールの書式設定で、“コ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vbaから他のアプリを終了
-
他のウィンドウのボタンを自動...
-
msgboxの表示位置
-
メッセージボックスの選択ボタ...
-
VBAでコントロールのハンドルを...
-
メッセージハンドラ
-
SetWindowText関数について
-
VB.netでFindWindowExやると・...
-
CloseHandle()
-
SendMessage で ESC など
-
VBA 複数セルが空白なら印刷さ...
-
デスクトップ上のアイコンの位...
-
WM_NCLBUTTONUPについて
-
システム例外のメッセージを変...
-
点滅で知らせる方法
-
Excel VBA で外部アプリケーシ...
-
VB6でシャットダウン、ログオフ...
-
ElseIfの使い方。
-
WM_CTLCOLORDLG
-
VB.netでSendMessageを使用して...
おすすめ情報