如何安全地关闭其中有无限循环的THREAD

时间:2015-03-25 09:23:04

标签: c++ c multithreading winapi beginthreadex

我正在使用_beginthreadex函数创建一个线程。我传入的函数地址有一个无限循环(while(1))。我有threadidthreadhandle

我可以使用TerminateThread(threadhandle,1);但这很危险。

安全的方法是使用_endthreadex杀死线程,但它只能在线程内部使用,我想从外部杀死线程。

因此,请建议使用threadidthreadhandle安全地从外部安全关闭,结束或终止线程。

3 个答案:

答案 0 :(得分:12)

你应该 - 字面意思 - 永远不要使用 TerminateThread()我甚至不开玩笑。如果从外部终止一个线程,其中保留的所有资源都将被泄露,内部访问的所有状态变量都将具有未确定状态,依此类推。


您的问题的解决方案可能是通知您的线程完成自己。它可以通过线程安全方式(参见 InterlockedIncrement())改变的volatile变量,Windows事件或类似的东西来完成。如果你的线程有一个消息循环,你甚至可以通过发送一条消息来要求它停止。

答案 1 :(得分: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。

答案 2 :(得分:7)

而不是while(1),您可以使用while(continue_running),其中continue_runningTrue,当线程循环运行时。如果要停止线程,请将控制线程设置为continue_runningFalse。当然,请确保使用互斥锁正确保护continue_running,因为它是一个可以从两个线程修改其值的变量。