std::thread 导致程序中止

Posted

技术标签:

【中文标题】std::thread 导致程序中止【英文标题】:std::thread causes program to abort 【发布时间】:2020-06-20 18:06:56 【问题描述】:

我有以下代码sn-p:

#include <thread>
int main()
    std::thread trial([]() return 2;);
    //trial.join()
    return 0;

由此我得到以下输出:

terminate called without an active exception
[1]    17963 abort (core dumped)  ./a.out

现在,当我在创建线程后调用.join() 时不会发生这种情况。据我所知,.join() 一直等到线程执行结束。但是,它似乎也可以防止中止的发生。有人可以解释发生了什么吗?

【问题讨论】:

【参考方案1】:

有人能解释一下发生了什么吗?

来自std::thread的析构函数的文档:

如果 *this 有关联线程(joinable() == true),则调用 std::terminate()

在例子中,你没有加入线程,所以当它被销毁时它是可加入的,因此进程std::terminate()被调用。默认情况下std::terminate() 调用std::abort

如果你加入,那么在加入之后,线程将无法加入。因此std::terminate()不会在销毁时被调用。

【讨论】:

在 C++20 中有 std::jthread 在销毁时加入而不是终止程序

以上是关于std::thread 导致程序中止的主要内容,如果未能解决你的问题,请参考以下文章

std::thread,在线程中抛出异常会导致 Visual C++ 中的中止错误

std::thread 在 vc++ 的析构函数中获取中止异常

为啥我会在这个程序中“中止”? [复制]

可连接 std::thread 的析构函数

std::thread 从一个函数开始而不等待线程完成[重复]

如何放弃或取消 std::thread