C++多线程未调用join()触发SIGABRT错误,疑use-after-free求解析
未调用join()导致程序SIGABRT的原因解析
你看到的
Process finished with exit code 134 (interrupted by signal 6: SIGABRT),本质是C++标准的强制行为:当std::thread对象被销毁时,如果它还处于「可join」状态(线程已启动但未调用join()或detach()),程序会直接触发std::terminate(),默认就会抛出SIGABRT终止进程。你的误区有两个:
- sleep时长不等于子线程执行完成的保证:操作系统的线程调度是完全不确定的,哪怕你觉得2秒足够子线程跑完,也不能100%保证主线程sleep结束时,子线程已经执行完毕。如果子线程还在运行,主线程退出后
Foo对象被销毁,子线程访问成员函数时就会触发真正的野指针问题,后果可能比SIGABRT更糟。 - 哪怕子线程真的提前跑完,线程对象的状态不会自动改变:
std::thread的「可join」状态不会因为子线程结束而自动切换。只要你没调用join(),这个线程对象就一直处于可join状态,销毁时照样会触发std::terminate(),和子线程实际是否运行完无关。
- sleep时长不等于子线程执行完成的保证:操作系统的线程调度是完全不确定的,哪怕你觉得2秒足够子线程跑完,也不能100%保证主线程sleep结束时,子线程已经执行完毕。如果子线程还在运行,主线程退出后
join()的作用不只是等子线程做完,更关键的是清理线程对象的状态:调用join()后,线程对象会从「可join」变成「不可join」,此时销毁它就不会触发终止逻辑。哪怕子线程已经提前结束,join()也只是做个状态重置,没有额外性能开销。
内容的提问来源于stack exchange,提问作者Edward Wang
相关产品推荐
相关产品推荐

