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++ 的析构函数中获取中止异常