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

发布于 2022-09-03 01:02:02 字数 1368 浏览 15 评论 0

请问一下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,执行程序的结果有可能为

clipboard.png
clipboard.png
clipboard.png

在linux(ubuntu)上,编译器g++ (Ubuntu 5.3.1-14ubuntu2.1) 5.3.1 20160413
执行程序执行了20~30遍一直是
clipboard.png
也曾经尝试过直接把t.join()直接注释掉,两个平台都会崩溃,但是windows还是会先输出Hello Current World!之后崩溃,而linux只输出了before和after

看过cppreference里面相关的内容,好像是说在构造函数如果有赋予入口函数的话就会直接开始执行?不过linux里面好像是直到调用join函数或者detach函数才会开始执行?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

神也荒唐 2022-09-10 01:02:16

加一行 get char()

子线程 都没运行,主线程都已经退出了。

短叹 2022-09-10 01:02:15

如果你在构造函数里传入了要执行的routine,那么线程就会在这个thread对象创建后开始执行,如果你只是单纯的创建了一个thread对象:

thread t;

那么这个线程是不会启动的,直到你给这个对象赋予了一段routine。
崩溃的原因是thread对象如果在析构前没有join或者detach,那么就会调用std::terminate终止程序(你可以看看thread的析构函数实现),GCC上的实现:

 ~thread()
    {
      if (joinable())
          std::terminate();
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文