新闻中心

c++20中的std::jthread有什么用_c++20中std::jthread线程使用方法与示例

2025-10-30
浏览次数:
返回列表
std::jthread 能自动 join 且支持协作式中断,相比 std::thread 更安全易用。它在析构时自动等待线程结束,避免资源泄漏,并通过 std::stop_token 实现线程取消,简化了多线程编程中的生命周期管理和中断处理。

c++20中的std::jthread有什么用_c++20中std::jthread线程使用方法与示例

在C++20中,std::jthread 是对 std::thread 的改进和补充,主要解决了资源管理和线程自动回收的问题。相比传统的 std::thread,std::jthread 能够自动调用 join(),避免因忘记调用 join 或 detach 导致的程序崩溃或未定义行为。

std::jthread 的核心优势

std::jthread(joining thread)具备以下关键特性:

  • 自动 join:析构时自动等待线程结束,无需手动调用 join()
  • 可协作中断:支持通过 std::stop_tokenstd::stop_source 实现线程的协作式中断
  • 更安全的接口:减少资源泄漏和未定义行为的风险

基本使用方法

创建一个 jthread 和使用 thread 类似,但无需手动管理生命周期。

#include <iostream>
#include <thread>
#include <chrono>

void simple_task() {
    for (int i = 0; i < 3; ++i) {
        std::cout << "Working... " << i << std::endl;
        std::this_thread::sleep_for(std::chrono::milliseconds(500));
    }
}

int main() {
    std::jthread t(simple_task); // 自动 join
    // 析构时会自动等待任务完成
    return 0;
}

输出:

Working... 0
Working... 1
Working... 2

支持线程中断的示例

std::jthread 最大的亮点是支持协作式中断。线程函数可以接收一个 std::stop_token,用于检测是否收到停止请求。

Pinokio Pinokio

Pinokio是一款开源的AI浏览器,可以安装运行各种AI模型和应用

Pinokio 232 查看详情 Pinokio
#include <iostream>
#include <thread>
#include <chrono>

void cancellable_task(std::stop_token stoken) {
    for (int i = 0; i < 10; ++i) {
        if (stoken.stop_requested()) {
            std::cout << "Task cancelled at step " << i << std::endl;
            return;
        }
        std::cout << "Step " << i << std::endl;
        std::this_thread::sleep_for(std::chrono::milliseconds(300));
    }
    std::cout << "Task completed normally." << std::endl;
}

int main() {
    std::jthread t(cancellable_task);

    std::this_thread::sleep_for(std::chrono::milliseconds(1200));

    std::cout << "Requesting stop..." << std::endl;
    t.request_stop(); // 发送停止请求

    return 0;
}

输出可能为:

Step 0
Step 1
Step 2
Step 3
Requesting stop...
Task cancelled at step 4

注意:线程函数必须接受 std::stop_token 作为第一个参数,否则无法响应中断请求。

获取 stop_token 并手动控制

你也可以在线程内部通过 get_stop_token() 获取 token,用于传递给其他函数。

void nested_task(std::stop_token stoken) {
    while (!stoken.stop_requested()) {
        std::cout << "Nested task running..." << std::endl;
        std::this_thread::sleep_for(std::chrono::milliseconds(400));
    }
}

void outer_task(std::stop_token stoken) {
    nested_task(stoken);
}

基本上就这些。std::jthread 让多线程编程更安全、简洁,尤其适合需要自动清理和可取消任务的场景。不再需要担心忘记 join,也不必使用复杂机制实现中断,是 C++20 对并发编程的重要增强。

以上就是c++++20中的std::jthread有什么用_c++20中std::jthread线程使用方法与示例的详细内容,更多请关注其它相关文章!


# 解决问题  # 唯一图库seo  # 安达实体店的推广营销  # 找家具的关键词排名  # 滑县郑州网站建设  # 网站推广优化外包效果好  # 雨湖区营销网站建设  # 松原seo排名加盟电话  # 固原智能网站优化设计  # 宁波企业seo电话  # 烧烤店营销推广语句文案  # 能为  # 它在  # ai  # 中文网  # 相关文章  # 第一个  # 边缘  # 什么用  # 游戏开发  # 多线程  # 并发编程  # stream  # ios  # c++ 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 在Blazor WebAssembly应用中动态注入客户端特定指标代码的策略  FullCalendar 自定义按钮样式定制指南  Python:递归比较文件夹内容并找出特定类型文件的差异  使用CSS更改登录屏幕输入框中PNG图标颜色的策略与局限性  字由网在线版登录地址 字由网网页版安全入口  Odoo 16:在表单视图中基于当前记录动态修改Tree视图属性  最新韩小圈网页版登录入口_官网在线观看官方链接  CSS Flexbox与媒体查询:实现响应式布局中元素的并排与堆叠  多闪网页版在线观看免费入口_多闪官网访问入口  如何在J*a中实现统一对象行为接口_项目大型化时的接口规范化  win11如何加载ICC颜色配置文件 Win11校色文件安装与显示器色彩管理【指南】  excel如何生成目录 excel一键生成工作表目录超链接  c++ 获取系统当前时间 c++时间戳获取方法  cad如何更改注释性对象的比例_cad注释性比例调整方法  12306选座如何查看座位示意图_12306座位示意图解读与使用  Golang如何安装Swagger工具_GoSwagger文档生成环境  痛风发作了怎么办? 快速止痛和后期饮食调理  J*a实现学校排课程序_面向对象结构化项目示例  sublime怎么进行远程开发编辑_配置rsub/rmate实现sublime编辑服务器文件  Fabric Mod开发:在1.19.3+版本中正确添加自定义物品并管理物品组  AngularJS $http POST请求数据传递与Go后端接收实践  想当下一个《2077》?《心之眼》Steam评价升至"多半好评"  sublime如何只显示或隐藏特定类型文件_sublime侧边栏文件过滤  电脑屏幕颜色不舒服怎么办_Windows夜间模式与色彩校准教程【护眼技巧】  快手赚钱渠道_快手收益来源  邮编格式怎么匹配地址_根据邮编格式快速匹配详细地址的技巧  12306选座怎么选到特殊座位_12306特殊座位选择注意事项  抖音商城签到领现金是真的吗_抖音商城签到奖励与提现说明  小米14应用无法联网原因分析_小米14网络权限修复  mcjs网页版流畅运行 mcjs低配电脑畅玩入口  J*aScript中安全有效地处理localStorage字符串数据  天猫2025双十一0点秒杀攻略 天猫爆款抢购时间  J*aScript类型检查_j*ascript代码规范  vivo云服务网页版登录 怎么登录vivo云服务网页版  poki免费入口快捷访问 poki人气小游戏直接玩站点  b站如何看历史记录_b站观看历史找回方法  Log4j Console Appender性能瓶颈与高并发优化策略  在J*a中如何使用Stream.map转换元素_Stream映射操作解析  微信商城在哪里打开【步骤】  解决J*aScript中重复选择项的确认对话框显示问题  age动漫网站入口 age动漫官网直接访问入口  win11怎么查看应用耗电情况 Win11电池设置查看应用能耗排行榜【优化】  sublime侧边栏怎么增强功能_SideBarEnhancements for sublime安装与配置  抓大鹅无需下载版 抓大鹅秒玩版入口  网易大神怎么保存别人动态的图片_网易大神动态图片保存方法  C++如何实现一个智能指针_手动实现C++ shared_ptr的引用计数功能  如何使用spryker/configurable-bundles-products-resource-relationship模块解决复杂产品捆绑关系难题  QQ邮箱官方网页版登录 QQ邮箱个人邮箱快速访问  J*a TimerTask中HashMap意外清空的深层原因与解决方案  Win11怎么查看显卡显存 Win11显示适配器属性及专用视频内存查询 

搜索