• ベストアンサー

スレッド終了について

複数のスレッドをbeginthreadで起動し、どれか1つでもスレッドが終了したら他のスレッドを終了させるというプログラムを組みたいのですが、どこかにそのようなサンプルありませんでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.1

実行環境やコンパイラが何か分かりませんが、仮にWindows環境でMicrosoft Cのランタイムライブラリにある_beginthreadを使うのだとすれば 1. 各スレッドで共通して参照するフラグを用意する。 2. 各スレッドの処理の中で、終了直前にフラグを立てる。 3. 各スレッドの処理の中で、フラグの状態を常にチェックし、フラグが立っていたら直ちに終了する。 のような実装を行うことで、各スレッドのうちどれか1つが終了したとき、他のスレッドが終了します。 3.の処理(フラグの状態を常にチェックする)のように各スレッドが自発的に終了するのではなく他のスレッドから強制的に終了させる方法は、Cランタイムライブラリの範囲にはありません。Win32 APIを使用すれば可能ですが、そうするとCランタイムライブラリの内部動作に不整合が発生しその後の動作が異常となる可能性があります。

poohpiglet2
質問者

お礼

ご回答ありがとうございます。 各スレッドで共通して参照するフラグというのは、 グローバル変数でよいのでしょうか?

その他の回答 (1)

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.2

グローバル変数でも良いです。

関連するQ&A

  • スレッドの終了の仕方

    こんばんわ 今スレッドを使ったプログラムを組んでいるのですが、_beginthreadexで起動したスレッド(無限ループ)二つをある条件の時にmainで終了させたいのですが、_endthreadでは特定のスレッドを終了させるようなパラメータが無いみたいなのでどうしていいかわかりません。CloseHandleだけでも終了させることができるのでしょうか??何かいい方法は無いでしょうか? windowsプログラム初心者なので分かりにくい質問で申し訳ないです。

  • スレッドについてお教えください。

    スレッドについてお教えください。 今、画面のプログラムより、帳票を出力しています。 帳票の出力に時間がかかるため画面のプログラムとは非同期に 別スレッドにして帳票を出力しようと考えたのですがこの場合 一つの帳票の処理中に同じ要求が複数来た場合、スレッドは 複数立ちあがってしまい帳票の順番が狂ってしまうものと 思います。 これを要求はキューしていくが、処理は順次行う(1処理終了後に 次の要求を処理する)ということは可能なのでしょうか? お願いいたします。

  • スレッドの終了はどうやるんですか?

    VCでスレッドの終了をしたいと考えてます。 自分自身のスレッドを終了するときは、AfxEndThread関数を使うようですが、動作中のスレッドを外から命令して終了させるときはどうすれば良いのか分からないです。教えていただけないでしょうか?

  • Servletのスレッドを終了させたい

    通常、一つのServletに対して、同一のsession idで(一つのクライアントで)複数並列処理します。 しかし、それじゃ都合が悪いので、一つのServletに対してはsession id毎に一つのスレッドしか発生しないようにしたいと思っています。ただ、あるスレッドが処理している最中にリクエストを受け付けたら、既に動いているスレッドを強制終了させて、後のリクエストのみを処理させたいと思っています。 が、なかなかいい案が思い浮かばず苦悩しています。 要求条件を整理すると次のようになります。 ・一つのServletに対して、一つのsession idで一つのスレッドだけしか処理しないようにしたい。 ・最後に受け付けたリクエストを活かし、処理中のスレッドは終了させたい。 二つ目の条件を満たすためには、一時的に二つのスレッドが発生することになると思っています。 皆様のお知恵をおかしください。

  • win32 スレッドのハンドルついて

    windowsのスレッドについての質問です。 今、手元にある書籍のスレッドを作る節にCreateThread()関数を使ってスレッドを作るサンプルプログラムが載っています。 その中では CloseHandle()関数が一切呼ばれていません。 しかも、そのサンプルではいくつもスレッドを作り、そのスレッドはプログラム中でいくつも終了するようなものです。CloseHandle()は呼び出さなくても問題ないのでしょうか? しかし、ネットで調べてみるとCloseHandle()を呼び出さなくてはいけないということが書かれていました。 http://www.daccho-it.com/program/WinApi/thread.htm ↑ 参考にしたサイト そこでいくつか質問です。 プロセスが終了するときにスレッドのハンドルは自動的に閉じられるという認識で大丈夫でしょうか? CreateThread()、_beginthreadex関数はCloseHandle()を呼び出す必要があるで大丈夫でしょうか? となると、CreateThread()の戻り値は必ず変数に保存しておく必要があるということですか? 書籍のサンプルではCreateThread()の戻り値はどこにも保存していませんでした、保存しない場合ハンドルが作られないってことはさすがにないですよね? よろしくお願いします。

  • VC++スレッドの正しい終了のさせかた

    VC++6.0にてAfxBeginThreadで m_bAutoDelete = TRUEにてスレッドをおこしております。 この終了時に制御関数のwhileループを脱する様にし、 正常にスレッドを終了させているつもりです。 この後、再度(アプリは継続して起動したまま) AfxBeginThreadにて全く同じ処理で再開すると、 なぜか、前のスレッドが未だ動作しているかのごとく 制御関数内のTRACEが2重に出力されます。 再度、停止し、またスレッド起動すると、 今度は3重になったかの様な動作をします。 スレッドが正しく終了されていないのでは?と思った現象として、 1回起動時にアプリを終了させると正常終了しますが、 2回起動以上は必ずスレッドのメモリーリークが出ます。 メモリーリーク個所はAfxBeginThreadでした。 制御関数内で必要ないとは思いましたが、終了時に AfxEndThreadを使用しましたが現象は同じでした。 そこで質問です。 1)この現象は、スレッドが正常に終了されていない事に起因しているのでしょうか? 2)スレッドを正しく終了させるにはどうすればいいのでしょうか? 当方、制御関数がループを抜け、さらにm_bAutoDelete = TRUEであれば オブジェクトも自動的に破棄されると思っていたのですが。。。 以上、よろしくお願いします。

  • スレッドの終了コード

    VC6.0でダイアログアプリケーションを作成しています。 デバッグモードで終了させると、アウトプットウィンドウに  スレッド 0x1124 終了、終了コード 0 (0x0)。  スレッド 0x1408 終了、終了コード 0 (0x0)。  スレッド 0x1118 終了、終了コード -1 (0xFFFFFFFF)。  スレッド 0x108C 終了、終了コード 0 (0x0)。 という内容が出力されるのですが、 終了コードが-1というのは異常終了になりますか? その場合、スレッド0x118を特定することはできるでしょうか? よろしくお願いいたします。

  • C#でスレッドを終了させるには、どのようにすれば良いでしょうか。

    C#でスレッドを終了させるには、どのようにすれば良いでしょうか。 http://msdn.microsoft.com/ja-jp/library/7a2f3ay4(VS.80).aspx のように、スレッドのループ条件をfalseにする関数を作りました。 ボタンを押したときにこの関数を呼び出すようにしたら、スレッドは終了しました。 しかし、アプリケーションが終了したらスレッドも終了するようにしたいと思います。 この関数をどこで呼び出すのが一般的でしょうか? よろしくお願いします。

  • Threadの終了

    http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/index.html を見ると,スレッドの止め方が書いてありますが, これは,スレッドblinker内でループが回っていて初めてうまく行く, と(間違ってるかもしれませんが)理解しています. では下記のように,Thread2でループが回っていない場合は (*)の位置でThread2を止めるにはどうすればいいのか, 教えてくださる方はいらっしゃいませんでしょうか. (**)のClassAではSWTでGUIを表示させていて, それをThread1から閉じるというのが目的です. GUIを閉じない限りその先には進まないので, ループを回しThread2のrun()内で待機させることが出来なくて. public class Thread1 { Thread1(){ Thread2 t2 = new Thread2(); t2.start(); try { Thread.sleep(5000); } catch (InterruptedException e) { } (*)ここでThread2を終了させたい. } public static void main(String args[]){ new Thread1(); } class Thread2 extends Thread { public void run() { new ClassA(); ・・・(**) } } }

    • ベストアンサー
    • Java
  • スレッドの終了を知りたい(WindowsAPI)

    CreateThread()で作成したスレッドの終了を知りたい (具体的には、スレッドが終了するまで待機したい)のですが、 うまくいかず困っています。WindowsAPIに関する本やネットで調べた ところ、WaitForSingleObject()が適用できると考え、 以下のようなプログラムを作成したのですが、 元のスレッドがWaitForSingleObject()のところで 止まると同時に、CreateThread()で作成されたThread_1()も 止まってしまいます。アドバイスいただけますでしょうか。 ----プログラム(該当部分)ここから---- DWORD Thread_1(LPVOID param) {  int i;  char buff[128];  /* iが99のときのみ終了してよい */  while(g_iFlg == 1)  {   for(i = 0; i < 100; i++)   {    Sleep(100);    wsprintf(buff, "%d", i);    SetDlgItemText((HWND)param, IDC_STATIC_1, buff);   }  }  ExitThread(0);  return 0; } BOOL CALLBACK Proc_2(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {  switch(uMsg)  {   case WM_INITDIALOG:    g_iFlg = 1;    g_hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Thread_1, (LPVOID)hDlg, 0, &g_dwThread);    return TRUE;   case WM_COMMAND:    switch(LOWORD(wParam))    {     case IDC_BUTTON_CANCEL:     case IDCANCEL:      g_iFlg = 0;      WaitForSingleObject(g_hThread, INFINITE);      CloseHandle(g_hThread);      EndDialog(hDlg, 0);      return TRUE;    }  }  return FALSE; } ----プログラム(該当部分)ここまで----

専門家に質問してみよう