首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何安全地关闭具有无限循环的线程?

如何安全地关闭具有无限循环的线程?
EN

Stack Overflow用户
提问于 2015-03-25 09:23:03
回答 3查看 7.5K关注 0票数 8

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

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-25 09:28:43

TerminateThread().--字面上说,从不使用,我甚至没有开玩笑。如果您要从外部终止一个线程,那么它中保留的所有资源都会被泄露,所有在里面访问的状态变量都会有一个未定的状态,依此类推。

您的问题的解决方案可能是向您的线程发出信号以完成其本身。可以通过线程安全方式更改易失性变量(参见InterlockedIncrement() )、Windows或类似的方法来完成。如果您的线程有消息循环,您甚至可以通过发送一条消息来要求它停止。

票数 14
EN

Stack Overflow用户

发布于 2015-03-25 09:27:39

正确的方法是使用CreateEvent创建一个事件“杀死我”,然后在您想要终止线程时标记这个事件。与其让线程等待while(1),不如让它等待while(WaitForSingleObject(hevent_killme, 0))。然后您可以简单地让线程回调完成并返回,不需要调用_endthreadex之类的。

回调函数示例:

代码语言:javascript
复制
static DWORD WINAPI thread_callback (LPVOID param)
{
  ...
  while(WaitForSingleObject(hevent_killme, 0) != WAIT_OBJECT_0)
  {
    // do stuff
  }

  return 0;
}

来电者:

代码语言:javascript
复制
HANDLE hevent_killme = CreateEvent(...);
...

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

永远不要使用TerminateThread。

票数 8
EN

Stack Overflow用户

发布于 2015-03-25 09:30:48

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29251723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档