std::jthread是C++20引入的RAII式线程类型,析构时自动join避免崩溃,并内置stop_source支持协作式中断;构造即启动、可移动、接口兼容std::thread,但更安全可控。

std::jthread 是 C++20 引入的现代化线程类型,全称是 joining thread,核心目标是解决 std::thread 在资源管理与线程控制上的两大痛点:析构时未 join 导致程序崩溃,以及缺乏安全、协作式的线程终止机制。
自动 join:避免 std::terminate 的“隐形炸弹”
std::thread 析构前若仍处于 joinable() 状态(既没 join() 也没 detach()),会直接调用 std::terminate(),整个程序立即中止——这个行为隐蔽且难以调试。而 std::jthread 在析构时自动执行 join(),确保所管理的线程完成后再销毁对象。
- 无需手动写
t.join(),异常路径或提前 return 也不怕泄漏 - 天然符合 RAII 原则:资源生命周期与对象生命周期严格绑定
- 构造即启动,语义清晰,与
std::thread接口高度兼容
协作式中断:用 stop_token 实现可控退出
std::jthread 内置 std::stop_source,可随时通过 request_stop() 发出停止请求;线程函数若接收 std::stop_token 参数,就能主动检查是否该退出,而不是被粗暴 kill。
- 线程函数签名需以
std::stop_token为首个参数(如[](std::stop_token st) { ... }) - 在循环中定期调用
st.stop_requested()或阻塞等待带 token 的条件变量 - 支持注册
std::stop_callback,在线程收到停止信号时自动执行清理逻辑 - 析构 jthread 时也会自动调用
request_stop(),再 join,双重保障
与 std::thread 的关键区别
虽然接口相似,但行为差异显著:
立即学习“C++免费学习笔记(深入)”;
-
std::thread不可复制,std::jthread同样不可复制,但可移动 -
std::jthread构造时若传入含stop_token的函数,会自动绑定内部stop_source并传入 token -
std::jthread提供get_stop_source()和get_stop_token(),方便外部协调 - 有轻微运行时开销(多一个
stop_source成员),但换来的是确定性安全
典型使用模式
最简用法与 std::thread 几乎一样:
#include#include int main() { std::jthread t([]{ for (int i = 0; i < 3; ++i) { std::this_thread::sleep_for(100ms); std::cout << "tick\n"; } }); // t 析构时自动 join,不用写 t.join() }
带中断支持的写法:
std::jthread t([](std::stop_token st) {
while (!st.stop_requested()) {
do_work();
std::this_thread::sleep_for(50ms);
}
cleanup(); // 退出前必执行
});
// 其他地方调用 t.request_stop() 即可通知它退出











