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(),确保所管理的线程完成后再销毁对象。

协作式中断:用 stop_token 实现可控退出

std::jthread 内置 std::stop_source,可随时通过 request_stop() 发出停止请求;线程函数若接收 std::stop_token 参数,就能主动检查是否该退出,而不是被粗暴 kill。

与 std::thread 的关键区别

虽然接口相似,但行为差异显著:

典型使用模式

最简用法与 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() 即可通知它退出
本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。