スレッドを、同じハンドルを利用して作る場合、
途中でハンドルの開放が必要か教えてください。
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も見ています
-
好きなおでんの具材ドラフト会議しましょう
肌寒くなってきて、温かい食べ物がおいしい季節になってきましたね。 みなさんはおでんの具材でひとつ選ぶなら何にしますか? 1番好きなおでんの具材を教えてください。
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
プリン+醤油=ウニみたいな組み合わせメニューを教えて!
プリンと醤油を一緒に食べると「ウニ」の味がする! というような意外な組み合わせから、新しい味になる食べ物って色々ありますよね。 あなたがこれまでに試した「組み合わせメニュー」を教えてください。
-
タイムマシーンがあったら、過去と未来どちらに行く?
20XX年、ついにタイムマシーンが開発されました。 あなたは過去に行く? それとも未来? タイムマシーンにのって、どこに行って、何をしたいか教えてください!
-
WaitForSingleObjectの使い方について
C言語・C++・C#
-
CString から LPCTSTRの型に変換
C言語・C++・C#
-
VB6.0 SHELLで起動したプログラムを終了さしたいのですが
Visual Basic(VBA)
-
-
4
DLLをGetProcAddress()で実行できない。
C言語・C++・C#
-
5
CString型の文字列連結について
C言語・C++・C#
-
6
UpdateData( FALSE); による文字列データの表示更新(VC++6.0)
C言語・C++・C#
-
7
MFCのエラーについて
C言語・C++・C#
-
8
スレッドの終了の仕方
C言語・C++・C#
-
9
(マルチスレッド)_beginthreadexに複数の引数を渡す
C言語・C++・C#
-
10
std::stringからLPCWSTR型への変換
C言語・C++・C#
-
11
スレッドの安全な終了のさせ方
C言語・C++・C#
-
12
【MFC】sleep関数を用いたモーダルダイアログを閉じる処理の実装方法
C言語・C++・C#
-
13
非同期のプロセス間通信(パイプ)で全データ受信する
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
メッセージボックスの選択ボタ...
-
点滅で知らせる方法
-
他のウィンドウのボタンを自動...
-
VBAでコントロールのハンドルを...
-
テキストボックスでコンテキス...
-
マウスフックについて
-
vbaから他のアプリを終了
-
VBA 複数セルが空白なら印刷さ...
-
Excel VBA で外部アプリケーシ...
-
グローバルフック(SetWindowsH...
-
msgboxの表示位置
-
モーダルウインドウとモードレ...
-
VB6でシャットダウン、ログオフ...
-
メッセージハンドラ
-
textboxに文字列を挿入したい。
-
キーボード入力をHSPでさせたい...
-
CloseHandle()
-
SetWindowText関数について
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vbaから他のアプリを終了
-
メッセージボックスの選択ボタ...
-
他のウィンドウのボタンを自動...
-
msgboxの表示位置
-
VBAでコントロールのハンドルを...
-
メッセージハンドラ
-
点滅で知らせる方法
-
VB.netでFindWindowExやると・...
-
SendMessage で ESC など
-
チェックボックスのキーダウン...
-
システム例外のメッセージを変...
-
Excel VBA で外部アプリケーシ...
-
CloseHandle()
-
VBA 複数セルが空白なら印刷さ...
-
SetWindowText関数について
-
VB.netでSendMessageを使用して...
-
デスクトップ上のアイコンの位...
-
windowsメールスロットについて...
-
メッセージループについて
-
VC++(MFC)でタスクバーに常駐し...
おすすめ情報