问题描述
请问一下C++11中<thread>的,thread具体是什么时候执行赋予它的函数?相关代码如下:
#include <iostream>#include <thread>void hello(){ std::cout << 'Hello Current World!' << std::endl;}int main(){ std::thread t(hello); std::cout << 'before: ' << std::endl; t.join(); std::cout << 'after: ' << std::endl; return 0 ;}
在windows平台上,IDE DEV-C++,编译器TDM-GCC 5.10,执行程序的结果有可能为
在linux(ubuntu)上,编译器g++ (Ubuntu 5.3.1-14ubuntu2.1) 5.3.1 20160413执行程序执行了20~30遍一直是也曾经尝试过直接把t.join()直接注释掉,两个平台都会崩溃,但是windows还是会先输出Hello Current World!之后崩溃,而linux只输出了before和after
看过cppreference里面相关的内容,好像是说在构造函数如果有赋予入口函数的话就会直接开始执行?不过linux里面好像是直到调用join函数或者detach函数才会开始执行?
问题解答
回答1:如果你在构造函数里传入了要执行的routine,那么线程就会在这个thread对象创建后开始执行,如果你只是单纯的创建了一个thread对象:
thread t;
那么这个线程是不会启动的,直到你给这个对象赋予了一段routine。崩溃的原因是thread对象如果在析构前没有join或者detach,那么就会调用std::terminate终止程序(你可以看看thread的析构函数实现),GCC上的实现:
~thread() { if (joinable()) std::terminate(); }回答2:
加一行 get char()
子线程 都没运行,主线程都已经退出了。