您的位置:首页 >C++20 jthread是什么?std::jthread详解
发布于2026-03-14 阅读(0)
扫一扫,手机访问
std::jthread是C++20引入的RAII式线程类型,析构时自动join避免崩溃,并内置stop_source支持协作式中断;构造即启动、可移动、接口兼容std::thread,但更安全可控。

std::jthread 是 C++20 引入的现代化线程类型,全称是 joining thread,核心目标是解决 std::thread 在资源管理与线程控制上的两大痛点:析构时未 join 导致程序崩溃,以及缺乏安全、协作式的线程终止机制。
std::thread 析构前若仍处于 joinable() 状态(既没 join() 也没 detach()),会直接调用 std::terminate(),整个程序立即中止——这个行为隐蔽且难以调试。而 std::jthread 在析构时自动执行 join(),确保所管理的线程完成后再销毁对象。
t.join(),异常路径或提前 return 也不怕泄漏std::thread 接口高度兼容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,在线程收到停止信号时自动执行清理逻辑request_stop(),再 join,双重保障虽然接口相似,但行为差异显著:
std::thread 不可复制,std::jthread 同样不可复制,但可移动std::jthread 构造时若传入含 stop_token 的函数,会自动绑定内部 stop_source 并传入 tokenstd::jthread 提供 get_stop_source() 和 get_stop_token(),方便外部协调stop_source 成员),但换来的是确定性安全最简用法与 std::thread 几乎一样:
#include <thread>
#include <iostream>
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() 即可通知它退出
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9