Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
c++的std::jthread如何自动join线程_c++20 RAII风格的线程管理_创想鸟

c++的std::jthread如何自动join线程_c++20 RAII风格的线程管理

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

c++的std::jthread如何自动join线程_c++20 raii风格的线程管理

在C++20中,std::jthread 是对传统 std::thread 的改进,它实现了RAII(Resource Acquisition Is Initialization)风格的线程管理,最关键的一点是:当 jthread 对象被销毁时,会自动调用 join(),避免程序因未正确等待线程结束而崩溃。

为什么需要 jthread?

在 C++11 到 C++17 中使用 std::thread 时,必须手动调用 join() 或 detach()。如果忘记这么做,线程对象在析构时会触发 std::terminate(),导致程序直接退出。

jthread 解决了这个问题——它在析构函数中自动调用 join(),确保线程安全地等待结束,无需开发者显式处理。

自动 join 的实现机制

std::jthread 在内部维护一个线程对象和一个停止令牌(stop token),其析构函数定义如下逻辑:

立即学习“C++免费学习笔记(深入)”;

如果线程处于 joinable() 状态(即还在运行或未被等待),则自动调用 join() 不再要求程序员记住是否已等待线程结束 避免因异常路径导致提前退出而遗漏 join示例代码:

#include #include #include 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 还引入了停止机制,允许外部请求线程停止执行:

通过 request_stop() 发送停止信号 线程函数可接收 std::stop_token 并定期检查是否应退出 实现安全、协作式的线程终止带中断检测的示例:

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::thread 的关键区别

自动 join:jthread 析构即 join,thread 必须手动操作 可取消性:jthread 支持 request_stop,thread 没有内置取消机制 RAII 更安全:异常安全更强,资源泄漏风险更低

基本上就这些。用 std::jthread 可以写出更简洁、更安全的多线程代码,尤其适合短生命周期线程或异常频繁的场景。不复杂但容易忽略的是:它不只是“自动 join”,更是现代 C++ 强调的“资源即对象”理念的体现。

以上就是c++++的std::jthread如何自动join线程_c++20 RAII风格的线程管理的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1487012.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
c++ set容器用法 c++ set去重原理详解
上一篇 2025年12月19日 10:19:15
C++如何实现一个代理模式_C++设计模式之为其他对象提供一种代理以控制对这个对象的访问
下一篇 2025年12月19日 10:19:21

相关推荐

发表回复

登录后才能评论
关注微信