首頁  >  問答  >  主體

c++11标准库新增的thread类开始执行的时间?

请问一下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函数才会开始执行?

ringa_leeringa_lee2715 天前644

全部回覆(2)我來回復

  • 阿神

    阿神2017-04-17 14:00:33

    如果你在建構函式裡傳入了要執行的routine,那麼執行緒就會在這個thread物件建立後開始執行,如果你只是單純的創建了一個thread物件:

    thread t;
    

    那麼這個線程是不會啟動的,直到你給了這個物件一段routine。
    崩潰的原因是thread物件如果在析構前沒有join或detach,那麼就會呼叫std::terminate終止程式(你可以看看thread的析構函式實作),在GCC上的實作:

     ~thread()
        {
          if (joinable())
              std::terminate();
        }
    

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 14:00:33

    加一行 get char()

    子執行緒 都沒運行,主執行緒都已經退出了。

    回覆
    0
  • 取消回覆