c++20 jthread是什么 c++可中断线程std::jthread【详解】

7次阅读

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

c++20 jthread 是什么 c++ 可中断线程 std::jthread【详解】

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 <<"tickn";}     });     // 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() 即可通知它退出 

text=ZqhQzanResources