8

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

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

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

因此,请建议是否有一种安全的方法可以从外部使用threadidor安全地关闭、结束或终止线程threadhandle

4

3 回答 3

14

你应该- 从字面上 -永远不要使用TerminateThread()我什至不是在开玩笑。如果您从外部终止一个线程,则其中保留的所有资源都将泄漏,内部访问的所有状态变量都将具有未确定的状态等等。


您的问题的解决方案可能是发出信号让您的线程自行完成。它可以通过线程安全方式更改的 volatile 变量(参见InterlockedIncrement())、Windows 事件或类似的东西来完成。如果您的线程有消息循环,您甚至可以通过发送消息要求它停止来做到这一点。

于 2015-03-25T09:28:43.463 回答
8

正确的方法是使用 CreateEvent 创建一个事件“杀死我”,然后在您希望杀死线程时标记此事件。与其让你的线程等待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), where线程循环应该运行的时间continue_runningTrue当你想停止线程时,将控制线程设置continue_runningFalse. 当然,请确保您正确continue_running使用互斥锁,因为它是一个可以从两个线程修改其值的变量。

于 2015-03-25T09:30:48.307 回答