C++创建std::thread线程两段代码运行差异及报错原因咨询
问题原因
这个报错的核心是C++标准对std::thread析构的强制规则:如果一个可联结(joinable)的std::thread对象被析构,程序会直接调用std::terminate终止运行,你看到的Abort trap:6就是程序被强制终止的系统信号。
两段代码的差异完全是std::thread对象的生命周期决定的:
- 第一段代码里,
std::thread th定义在main函数中,后面跟着死循环,程序永远不会走到main的return 0逻辑,th对象永远不会触发析构,自然不会触发终止逻辑,所以能正常运行。 - 第二段代码里,
std::thread th定义在a函数的内部局部块中,当这个块执行结束后,th就会离开作用域触发析构,这时候你没有对th调用join()或者detach(),th处于可联结状态,所以直接触发标准规定的终止逻辑,报出对应错误。
补充说明:你贴的第二段代码存在书写笔误,
a函数定义处多了一层左大括号,实际运行前需要先修正语法错误,就算修正语法后还是会触发析构终止的问题。
修复方案
你可以根据业务需求二选一处理即可:
- 调用
join()等待线程执行完成:在th离开作用域前加th.join(),主线程会阻塞直到b函数执行完毕再继续后续逻辑。 - 调用
detach()分离线程:在th离开作用域前加th.detach(),线程会在后台独立运行,和th对象解绑,th析构的时候不会触发终止逻辑。
内容的提问来源于stack exchange,提问作者user15747807
相关产品推荐
相关产品推荐

