C ++多线程 - 子线程什么时候退出?

时间:2011-01-27 06:47:02

标签: c++ multithreading

我创建了一个线程,结构的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然后调用子线程?

1 个答案:

答案 0 :(得分:1)

一个选项是让主线程发信号通知它应该退出的子线程(可能通过设置一个布尔标志),然后在main()的末尾使用WaitForSingleObject来等待线程终止,然后再返回并调用破坏者。这可以防止在描述符触发之前强制线程退出(以安全的方式)所描述的错误。

相关问题