std::jthread通过自动join和协作式中断提升线程安全性,其析构时自动等待线程结束,避免因未手动调用join导致的程序终止,同时支持通过stop_token请求取消线程执行,实现更安全、简洁的RAII式多线程编程。

在C++20中,std::jthread 是对传统 std::thread 的改进,它实现了RAII(Resource Acquisition Is Initialization)风格的线程管理,最关键的一点是:当 jthread 对象被销毁时,会自动调用 join(),避免程序因未正确等待线程结束而崩溃。
在 C++11 到 C++17 中使用 std::thread 时,必须手动调用 join() 或 detach()。如果忘记这么做,线程对象在析构时会触发 std::terminate(),导致程序直接退出。
jthread 解决了这个问题——它在析构函数中自动调用 join(),确保线程安全地等待结束,无需开发者显式处理。
std::jthread 在内部维护一个线程对象和一个停止令牌(stop token),其析构函数定义如下逻辑:
立即学习“C++免费学习笔记(深入)”;
<pre class="brush:php;toolbar:false;">#include <thread>
#include <iostream>
#include <chrono>
void worker() {
for (int i = 0; i < 5; ++i) {
std::this_thread::sleep_for(std::chrono::milliseconds(100));
std::cout << "Working... " << i << "\n";
}
}
int main() {
std::jthread t(worker); // 启动线程
// 不需要写 t.join()!
// 当 t 离开作用域时,自动调用 join()
std::cout << "Main exits, jthread will join automatically.\n";
return 0;
} // t 被销毁,自动阻塞等待 worker 完成
std::jthread 还引入了停止机制,允许外部请求线程停止执行:
<pre class="brush:php;toolbar:false;">void cancellable_worker(std::stop_token stoken) {
for (int i = 0; i < 100; ++i) {
if (stoken.stop_requested()) {
std::cout << "Worker cancelled.\n";
return;
}
std::this_thread::sleep_for(std::chrono::milliseconds(50));
std::cout << "Step " << i << "\n";
}
}
int main() {
std::jthread t(cancellable_worker);
std::this_thread::sleep_for(std::chrono::milliseconds(200));
t.request_stop(); // 请求停止
// 析构时仍会自动 join
return 0;
}
基本上就这些。用 std::jthread 可以写出更简洁、更安全的多线程代码,尤其适合短生命周期线程或异常频繁的场景。不复杂但容易忽略的是:它不只是“自动 join”,更是现代 C++ 强调的“资源即对象”理念的体现。
以上就是c++++的std::jthread如何自动join线程_c++20 RAII风格的线程管理的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号