新闻中心

C++ async与future用法教程_C++异步任务返回值获取方法

2025-12-02
浏览次数:
返回列表
C++中async与future用于异步任务执行和结果获取,std::async启动任务并返回std::future对象,通过get()阻塞获取结果,支持超时检测与异常传递,提升并发编程效率。

c++ async与future用法教程_c++异步任务返回值获取方法

C++中的asyncfuture是处理异步任务和获取返回值的核心工具,适用于需要并发执行且获取结果的场景。它们定义在<future></future>头文件中,配合使用可以轻松实现多线程任务的非阻塞调用和结果获取。

async与future基本概念

std::async用于启动一个异步任务,返回一个std::future对象,该对象可用来获取任务的返回值或异常。任务可以在新线程中执行,也可以延迟执行,取决于启动策略。

常用启动策略:

  • std::launch::async:强制在新线程中执行任务
  • std::launch::deferred:延迟执行,直到调用get()时才在当前线程执行

默认策略是两者均可,由系统决定。

获取异步函数的返回值

通过future.get()获取异步任务的返回值,该调用会阻塞,直到结果就绪。

示例代码:
#include <iostream>
#include <future>
#include <thread>

int compute_sum(int a, int b) {
    std::this_thread::sleep_for(std::chrono::seconds(2));
    return a + b;
}

int main() {
    // 启动异步任务
    std::future<int> result = std::async(std::launch::async, compute_sum, 10, 20);

    std::cout << "正在执行计算...\n";

    // 获取结果(阻塞等待)
    int sum = result.get();
    std::cout << "结果: " << sum << "\n";

    return 0;
}

输出:

正在执行计算...
结果: 30

注意:get()只能调用一次,之后future变为无效状态。

TTSMaker TTSMaker

TTSMaker是一个免费的文本转语音工具,提供语音生成服务,支持多种语言。

TTSMaker 2275 查看详情 TTSMaker

检查任务状态与非阻塞获取

使用future.wait_for()future.wait_until()可实现超时检查,避免长时间阻塞。

示例:带超时的结果获取
std::future<int> fut = std::async(compute_sum, 5, 15);

auto status = fut.wait_for(std::chrono::milliseconds(100));
if (status == std::future_status::ready) {
    std::cout << "结果: " << fut.get() << "\n";
} else {
    std::cout << "任务未完成\n";
}

这适合对响应时间敏感的应用,比如用户界面或实时系统。

异常传递与错误处理

异步任务中抛出的异常会被捕获并存储,调用get()时重新抛出。

std::future<void> f = std::async([]{
    throw std::runtime_error("任务失败");
});

try {
    f.get();
} catch (const std::exception& e) {
    std::cout << "捕获异常: " << e.what() << "\n";
}

这种机制让主线程能统一处理异步任务的异常,提升程序健壮性。

基本上就这些。掌握async与future的组合使用,能有效简化C++异步编程中的结果获取流程,避免手动管理线程和共享数据的复杂性。

以上就是C++ async与future用法教程_C++异步任务返回值获取方法的详细内容,更多请关注其它相关文章!


# 长时间  # 黄山网站优化排名怎么选  # 长沙学院网站建设  # 淘宝关键词搜索排名特点  # seo官网优化排名  # 国外电影网站建设  # 义乌哪里可以学seo  # 郑州seo优化战略  # 亳州托管式推广营销电话  # 众筹型的推广营销模式是  # 西青区品牌营销推广中心  # 中文网  # 相关文章  # 适用于  # 工具  # 是一个  # 化与  # 抛出  # 套件  # 多线程  # 返回值  # red  # 异步任务  # 并发编程  # stream  # ios  # c++  # ai 


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


相关推荐: C++如何操作注册表_Windows平台下C++读写注册表的API函数详解  MongoDB Aggregation:在嵌套对象数组中精确匹配ObjectId  漫蛙网页登录入口 漫蛙漫画官方授权网址  Animex动漫社网入口地址 Animex动漫社网正版在线入口  漫蛙官网正版漫画入口 漫蛙2官方网页登录地址  在Pyomo中实现基于变量的条件约束:Big-M方法详解  win11怎么查看应用耗电情况 Win11电池设置查看应用能耗排行榜【优化】  c++如何使用chrono库处理时间_c++标准库时间与日期操作  QQ邮箱网页版快速登录 QQ邮箱邮箱账号官方入口地址  126邮箱网页版官方入口 126邮箱账号在线登录平台  Composer的 "check-platform-reqs" 命令有什么用_在部署前检查生产环境是否满足Composer依赖需求  2026春节假期时间安排 2026春节假日查询  抖音网页版企业服务中心登录入口_抖音网页版企业登录平台  必由学官方登录入口 必由学教师学生账号快速访问  Node.js中HTML按钮与J*aScript函数交互的正确姿势  2025俄罗斯Yandex最新入口 官方网站地址及浏览器下载指南  AO3最新官网入口公告_2025AO3镜像站实时查询方法  J*aScript中安全有效地处理localStorage字符串数据  vivo云服务网页版登录 怎么登录vivo云服务网页版  J*aScript:在map操作中高效处理空数组  支付宝如何设置安全保护_支付宝安全设置的全面教程  Python多版本共存与虚拟环境管理深度指南  抖音创作助手登录入口_抖音创作辅助工具官网直达  c++如何使用Catch2编写单元测试_c++简洁易用的BDD风格测试框架  解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException  《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致!  包子漫画官方网站在线链接-包子漫画在线阅读平台主页地址  Lar*el用户头像管理:实现图片缩放、存储与旧文件安全删除的最佳实践  Win11如何开启讲述人功能 Win11屏幕阅读器(讲述人)开启与关闭【教程】  解决深度学习模型训练初期异常高损失与完美验证准确率问题  Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度  抖音商城签到领现金是真的吗_抖音商城签到奖励与提现说明  Tailwind CSS line-clamp 布局问题解析与修复指南  荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程  天猫2025双十一0点秒杀攻略 天猫爆款抢购时间  Angular中父组件异步更新子组件复选框状态的实践指南  夸克AO3官网入口_AO3镜像网站2025推荐  如何在Promise链中有效终止错误处理后的执行  如何在Promise链中优雅地中断后续then执行  qq邮箱日历功能怎么用_创建日程与会议邀请的技巧  淘宝网网页版登录入口 淘宝官方网页版快捷登录  c++中的std::launder有什么实际用途_c++对象生命周期与指针优化  c++如何实现一个简单的ECS框架_c++数据驱动设计与游戏开发  微信网页版扫码登录入口 微信网页版二维码登录入口  Composer中的^和~符号代表什么_精通Composer版本号语义化约束  实现全屏滚动与导航点:专业教程  PDF文件体积过大处理_PDF压缩技巧详解  谷歌google账号注册详细步骤 谷歌账号注册官方教程  妖精动漫免费平台 妖精动漫官网资源观看网址  夸克浏览器图书入口 夸克手机浏览器阅读入口 

搜索