我创建了一个线程,结构的void *作为参数传递给它。此结构在类中创建。当调用此类析构函数时,即在main的末尾,将删除该结构。所以后来我看到子线程再次启动,并且引用它的void *参数会抛出异常,因为它已经被释放了。我希望子线程在析构函数被调用之前退出,但这种情况并没有发生。
从MSDN中的Exitthread页面
但是,在C ++代码中,线程是 在任何析构者出现之前退出 被叫或任何其他自动清理 可以进行。
上述行所指的析构函数是什么?
子线程在具有主线程生命周期的过程上执行。使用全局标志,我以为我可以控制子线程执行。我在主线程执行的最后一个例程上设置了全局标志。但是,在子线程终止之前,全局对象是否会被释放。在那种情况下,即使这样也不会帮助我。
总结一下,最好的办法是什么才能退出具有主线程生命周期的子线程?我不想使用terminatethread api。
编辑:一些代码示例
//在主要结尾处的方法
void EndofMain()
{
WaitForSingleObject(globalObj->hMutex, INFINITE)
globalObj->threadActive = false;
ReleaseMutex(globalObj->hMutex);
}
void ChildThreadProc(void* data)
{
while(globalObj->threadActive)
{
WaitForSingleObject(globalObj->hMutex, INFINITE)
//do other stuff
ReleaseMutex(globalObj->hMutex);
sleep(1000);
}
}
现在是否有可能释放globalObj然后调用子线程?
答案 0 :(得分:1)
一个选项是让主线程发信号通知它应该退出的子线程(可能通过设置一个布尔标志),然后在main()的末尾使用WaitForSingleObject来等待线程终止,然后再返回并调用破坏者。这可以防止在描述符触发之前强制线程退出(以安全的方式)所描述的错误。