【问题标题】:c++ thread alive?c++线程还活着吗?
【发布时间】:2012-03-01 09:25:01
【问题描述】:

怎么做?

我尝试了 WaitingForSingleObject、GetExitCodeThread 等,但是当我用进程资源管理器杀死线程时没有任何反应。

while(true)
{
    if(GetThreadId(this->hWatchThread) == 0) // Always return killed thread id!
        break;
}

更新: 当我杀死线程时,它停止工作,但我无法从 GetThreadId 获取退出代码或零值

【问题讨论】:

  • 不,WaitForSingleObject 永远不会返回值。
  • 是的,可靠。我在许多项目中都使用它。
  • 是的,它在完成工作后线程退出时返回值,但在我手动杀死它时不返回。
  • 你是如何创建线程的?线程句柄上的 WaitForSingleObject 将是这里的标准解决方案,但存在陷阱 - 例如,您必须确保线程不会自动释放自己的句柄。

标签: c++ multithreading winapi


【解决方案1】:

当一个线程被强行杀死时,例如从任务管理器或进程资源管理器中,不会更改线程 ID。线程句柄仍然存在,因为您的进程尚未关闭它。并且与该线程关联的线程 ID 仍然存在。所以GetThreadId 总是会返回一个非零值。

至于退出代码,因为线程没有退出,所以无法为退出代码获取有意义的值。它被杀了。它从来没有机会设置退出代码。

您必须做的是使用等待功能之一,例如WaitForSingleObject,等待你的线程句柄。如果该等待因线程被杀死而终止,则等待函数将返回并报告成功等待,并且线程退出代码将报告为0。据我所知,您无法通过 Windows API 辨别您的线程被异常终止。

您可以做的是使用自己的机制来指示终止异常。创建一个由线程拥有的标志,以记录终止是正常的。当线程开始执行时,将该标志设置为 false。当线程正常终止时,将该标志设置为 true。这样你就可以通过在线程终止后读取该标志的值来判断线程是否异常终止。

【讨论】:

  • 一个布尔标志的例子?你当然可以解决这个问题。在线程过程开始时将其设置为 false,甚至在创建线程之前将其设置为更好。然后在你的线程进程退出之前将其设置为 true。
  • 我如何获得线程状态?如果它总是假的,我不知道它什么时候死。
  • 您必须致电WaitForSingleObject 等待它终止。或者调用GetExitCodeThread进行异步检查。
【解决方案2】:

如果你想在线程退出后做某事:

WaitForSingleObject(handle_to_your_thread,INFINITE);
MessageBox(NULL,"Thread has exited","Foo",MB_ICONINFORMATION);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    相关资源
    最近更新 更多