C++ C++;多线程-子线程何时退出?

C++ C++;多线程-子线程何时退出?,c++,multithreading,C++,Multithreading,我创建一个线程,将结构的void*作为参数传递给该线程。此结构是在类中创建的。当调用此类析构函数时,即在main的末尾,该结构将被删除。因此,稍后我看到子线程再次启动,引用其void*参数会抛出一个异常,因为它已经被释放。我希望子线程在调用析构函数之前退出,但事实并非如此 从MSDN中的Exitthread页 但是,在C++代码中,线程是 在调用任何析构函数之前退出 调用或任何其他自动清理 可以执行 上面这一行所指的析构函数是什么 子线程在具有主线程生命周期的过程上执行。使用全局标志,我想我可以

我创建一个线程,将结构的void*作为参数传递给该线程。此结构是在类中创建的。当调用此类析构函数时,即在main的末尾,该结构将被删除。因此,稍后我看到子线程再次启动,引用其void*参数会抛出一个异常,因为它已经被释放。我希望子线程在调用析构函数之前退出,但事实并非如此

从MSDN中的Exitthread页

但是,在C++代码中,线程是 在调用任何析构函数之前退出 调用或任何其他自动清理 可以执行

上面这一行所指的析构函数是什么

子线程在具有主线程生命周期的过程上执行。使用全局标志,我想我可以控制子线程的执行。我在主线程执行的最后一个例程上设置了全局标志。但全局对象是否在子线程终止之前解除分配。那样的话,即使那样也帮不了我

总之,退出具有主线程生命周期的子线程的最佳方式是什么?我不想使用TerminateThreadAPI

编辑:一些代码示例

//在main末尾的方法中

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,然后调用子线程?

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

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

c++还没有任何类型的多线程支持。这意味着你正在使用一个库:Boost、pTrices、Win32线程,或者某种类型的厂商扩展:MSVC的“SuxStudioDeX API”,例如,请说哪个C++还没有任何类型的多线程支持。这意味着您正在使用一个库:boost、pthreads、win32 threads或某种供应商扩展:msvc的_beginthreadexapi for eg。请说出哪个。我确实在main的末尾设置了一个布尔标志。但是WaitForSingleObject如何保证线程终止呢?
WaitForSingleObject(threadHandle,INFINITE)
直到线程终止才会返回(除非出现意外错误)。此链接提供了一个示例和有用的描述:@Vivek,Templatetypedef的意思是传递给WaitForSingleObject的句柄应该是线程句柄。这就是WaitForSingleObject保证线程已终止的方式——在线程终止之前它不会返回。线程需要定期检查标志,如果设置了标志,线程需要尽快退出。通常,这只需从threadproc返回,而不是调用ExitThread即可完成。但是WaitForSingleObject如何保证线程终止呢?
WaitForSingleObject(threadHandle,INFINITE)
直到线程终止才会返回(除非出现意外错误)。此链接提供了一个示例和有用的描述:@Vivek,Templatetypedef的意思是传递给WaitForSingleObject的句柄应该是线程句柄。这就是WaitForSingleObject保证线程已终止的方式——在线程终止之前它不会返回。线程需要定期检查标志,如果设置了标志,线程需要尽快退出。通常,这只需从threadproc返回,而不是调用ExitThread。