繁体   English   中英

如何安全地关闭包含无限循环的线程

[英]How to safely close a THREAD which has a infinite loop in it

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

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

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

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

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


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

正确的方法是使用 CreateEvent 创建一个事件“杀死我”,然后在您希望杀死线程时标记此事件。 与其让你的线程等待while(1)while(WaitForSingleObject(hevent_killme, 0))让它等待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。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM