【问题标题】:How to manually release stack memory after the thread is forcefully killed?线程被强行杀死后如何手动释放栈内存?
【发布时间】:2016-05-19 13:27:33
【问题描述】:

我正在使用看门狗线程来监视 Visual c++ 中的子线程,如果看门狗在一定时间后停止向看门狗发送事件,它将终止子线程并创建一个新的子线程。在我的测试中,我反复终止并重新生成子线程,在它有机会退出之前,我发现它会导致内存泄漏。我的主要怀疑是由于孩子创建的堆栈内存并且在终止时未能释放。在重新生成新的子线程之前,看门狗线程有没有办法手动释放子线程的堆栈内存?我实际上使用这种方法来杀死任何冻结线程,到目前为止 TerminateThread() 是我唯一的选择。下面是我如何进行测试的简单说明。谢谢。

void watchdogFunc (void)
{
    while(true){
        child  = CreateThread(NULL, 0, childFunc, NULL, 0, NULL);
        TerminateThread(child, 1);
    }
}

void childFunc (void)
{
    while(true){} //simulated thread freeze
}

【问题讨论】:

  • 你怎么知道有内存泄漏?
  • 内存泄漏很可能是因为您在线程中分配的内存。不是堆栈。
  • 我的意思是它不是堆栈。直接与否,它是堆中正在泄漏的东西。 TerminateThread 将释放堆栈msdn.microsoft.com/en-us/library/windows/desktop/…
  • 底线是使用 TerminateThread 几乎总是错误的,如果你正在泄漏内存,那么你正在分配(直接或间接) - 这证明你的情况是错误的。可能被异步取消的线程分配的内存偶尔会导致堆损坏或持有锁,这样其他线程可能会在以后锁定。可能只有 10 分之一,或 10,000,000 分之一,对于运行您的应用程序的其他人来说,可能比对您来说更多。您的看门狗/监控线程应该设置一个标志,要求线程在下次检查时自行关闭。
  • @Charles 您不应该显式调用析构函数。前进的道路是解决线程无法正常完成的问题,而不是添加层层的hack来解决它。

标签: c++ multithreading terminate


【解决方案1】:

来自TerminateThread() 的文档:

系统释放线程的初始堆栈。

你找错树了。

你当然应该使用 C++ 线程类,而不是直接使用CreateThread()/TerminateThread()

【讨论】:

    猜你喜欢
    • 2019-09-04
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 2019-07-24
    • 1970-01-01
    • 2011-03-24
    相关资源
    最近更新 更多