【发布时间】: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