这是一些崩溃Visual Studio 2013(VS12)C ++应用程序的简单代码 -
#include <thread>
void empty_thread_function()
{
// intentionally empty
}
void main()
{
std::thread my_thread(&empty_thread_function);
}
我注意到,如果我detach()
或join()
main()
,启动my_thread
后就没有崩溃了。此外,程序在主线程返回时崩溃(无论空线程是否已返回)。
任何人都知道这里发生了什么?
答案 0 :(得分:4)
您需要在退出my_thread.join();
之前致电main
。
这是有效的,因为如果在std::terminate
时运行thread
析构函数,则默认行为是为应用程序调用{{3}}。
std::thread::~thread
销毁线程对象。
如果
*this
有关联的帖子(joinable() == true
),则会调用std::terminate()
。
或者,您可以致电detach()
。但正如您已经注意到给定的代码片段,当主线程退出并且您仍然有其他线程在运行时,您会遇到更多问题。
当主线程(第一个线程)退出并清除(因此可能崩溃)在第二个线程完成之前开始时,进程退出。因此,在退出应用程序之前等待用户创建的线程完成通常是一个更好的主意。