8

関数を使用してスレッドを作成してい_beginthreadexます。私が渡している関数アドレスには、無限の while ループ ( while(1)) があります。と がthreadidありthreadhandleます。

使えますTerminateThread(threadhandle,1);が危険です。

安全な方法は、使用してスレッドを強制終了_endthreadexすることですが、スレッドの内側からしか使用できないため、スレッドを外側から強制終了したかったのです。

threadidしたがって、またはを使用して外部からスレッドを安全に閉じたり、終了したり、強制終了したりする安全な方法があるかどうかを提案してくださいthreadhandle

4

3 に答える 3

14

文字通り - TerminateThread()を使用しないでください冗談でもありません。外部からスレッドを終了する場合、そのスレッドで予約されているすべてのリソースがリークされ、内部でアクセスされるすべての状態変数が未確定の状態になるなどです。


問題の解決策は、スレッド自体を終了するように通知することかもしれません。これは、スレッドセーフな手段 ( InterlockedIncrement()を参照)、Windows イベント、またはそのようなものによって変更された揮発性変数によって実行できます。スレッドにメッセージ ループがある場合は、メッセージを送信して停止するように要求することもできます。

于 2015-03-25T09:28:43.463 に答える
8

適切な方法は、CreateEvent を使用して「kill me」イベントを作成し、スレッドを強制終了したいときにこのイベントにフラグを立てることです。スレッドを待機させる代わりに、待機させwhile(1)ますwhile(WaitForSingleObject(hevent_killme, 0))。そして、_endthreadex などを呼び出す必要はなく、単純にスレッド コールバックを終了させて​​返すことができます。

コールバック関数の例:

static DWORD WINAPI thread_callback (LPVOID param)
{
  ...
  while(WaitForSingleObject(hevent_killme, 0) != WAIT_OBJECT_0)
  {
    // do stuff
  }

  return 0;
}

発信者:

HANDLE hevent_killme = CreateEvent(...);
...

void killthread (void)
{
  SetEvent(hevent_killme);
  WaitForSingleObject(hthread_the_thread, INFINITE);
  CloseHandle(hevent_killme);
  CloseHandle(hthread_the_thread);
} 

TerminateThread は使用しないでください。

于 2015-03-25T09:27:39.880 に答える
7

の代わりにwhile(1)、 を使用できますwhile(continue_running)。ここcontinue_runningTrue、 はスレッド ループを実行する必要があります。スレッドを停止させたい場合は、制御スレッドを に設定continue_runningしてFalseください。もちろんcontinue_running、mutex は 2 つのスレッドから値を変更できる変数であるため、mutex で適切にガードするようにしてください。

于 2015-03-25T09:30:48.307 に答える