新闻中心

c++中std::async和std::future的用法_c++异步任务与结果获取机制讲解

2025-11-25
浏览次数:
返回列表
std::async和std::future用于异步任务执行与结果获取,通过launch策略控制执行方式,future.get()阻塞获取结果并传播异常,支持限时等待与异常安全处理,简化并发编程。

c++中std::async和std::future的用法_c++异步任务与结果获取机制讲解

在C++11中引入的 std::asyncstd::future 提供了一种简洁、安全的方式来执行异步任务并获取其结果。它们是标准库中支持并发编程的重要工具,适用于需要后台计算并等待结果的场景。

std::async:启动异步任务

std::async 是一个函数模板,用于启动一个异步任务(即在单独的线程或延迟执行中运行一个可调用对象),它返回一个 std::future 对象,用来获取该任务的返回值。

基本语法:

std::future<T> result = std::async(launch_policy, function, args...);
  • launch_policy:指定任务的启动策略,可选值有:
    • std::launch::async:强制在新线程中异步执行。
    • std::launch::deferred:延迟执行,直到调用 future 的 get 或 wait 时才在当前线程执行。
    • 默认值为两者均可(std::launch::async | std::launch::deferred),由系统决定。
  • function:要异步执行的函数、lambda 表达式或仿函数。
  • args...:传递给函数的参数。

示例:

#include <iostream>
#include <future>
#include <chrono>

int slow_calculation() {
    std::this_thread::sleep_for(std::chrono::seconds(2));
    return 42;
}

int main() {
    auto future_result = std::async(std::launch::async, slow_calculation);
    
    std::cout << "正在执行其他操作...\n";
    
    int value = future_result.get(); // 阻塞直到结果就绪
    std::cout << "结果: " << value << "\n";
    
    return 0;
}

std::future:获取异步结果

std::future 是一个模板类,表示一个可能尚未完成的异步操作的结果。通过调用其成员函数 get() 可以获取结果,此调用会阻塞,直到结果可用。

常用方法:

美图云修 美图云修

商业级AI影像处理工具

美图云修 50 查看详情 美图云修
  • .get():获取结果,只能调用一次,之后 future 变为无效状态。
  • .wait():等待任务完成,不获取结果。
  • .valid():检查 future 是否关联了有效的共享状态。
  • .wait_for(timeout) / .wait_until(time_point):限时等待,可用于避免无限阻塞。

示例:限时等待结果

auto future = std::async(slow_calculation);

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

共享状态与异常处理

std::future 所持有的“共享状态”是由 async 创建的任务和 future 共同访问的数据结构。当任务抛出异常时,该异常会被封装并在线程调用 get() 时重新抛出。

示例:捕获异步任务中的异常

auto faulty_task = std::async([](){
    throw std::runtime_error("出错了!");
});

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

这种机制保证了异常不会丢失,便于统一错误处理。

实际使用建议与注意事项

  • 避免多个线程同时调用同一个 future 的 get(),因为只能成功调用一次。
  • 如果不关心返回值,可以使用 std::async 启动任务后立即 wait() 等待完成。
  • 注意资源消耗:std::launch::async 可能创建新线程,频繁使用可能导致线程过多。
  • 如果希望延迟执行,使用 std::launch::deferred,适合轻量或可能不需要执行的任务。
  • future 析构时若仍有关联的异步任务且为 deferred 模式,行为正常;但 async 模式下会阻塞等待完成(C++14 起)。

基本上就这些。std::async 和 std::future 让异步编程变得直观且类型安全,适合大多数需要“发任务、等结果”的场景,无需手动管理线程生命周期。

以上就是c++++中std::async和std::future的用法_c++异步任务与结果获取机制讲解的详细内容,更多请关注其它相关文章!


# 抛出  # 企业网站建设优化建议  # 汽车行业营销推广策略分析怎么写  # 大连企业网站建设方案  # 塘厦化工网站建设  # 三门峡网络推广营销招聘  # 石家庄网站推广招聘网址  # 湖州关键词排名多少钱  # seo加盟直营  # 上海房地产线上营销推广  # 揭阳seo优化厂商  # 是由  # 多个  # 返回值  # 有什么区别  # 工具  # 是一个  # 数据结构  # 如何实现  # 如何使用  # 美图  # red  # 标准库  # 异步任务  # 并发编程  # stream  # ios  # c++  # ai 


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


相关推荐: 微博网页版官方账号登录 微博网页版内容浏览使用指南  俄罗斯方块最新版入口 俄罗斯方块在线玩官网入口  拼多多赚钱渠道_拼多多收益来源  GemBox Document HTML转PDF垂直文本渲染问题及解决方案  CSS响应式网页如何实现主次模块比例自适应_flex-grow与flex-shrink调整  如何使用J*aScript精确选择并批量修改特定父元素下子链接的样式  TikTok国际版网页端快速入口 TikTok全球版短视频浏览教程  J*aScript中针对特定容器内图片动画的实现教程  《马克思佩恩3》早期版本曝光 UI设计曾多次调整!  css卡片内容溢出如何处理_使用overflow隐藏或scroll显示内容  J*a递归快速排序中静态变量导致数据累积问题的解决方案  知音漫客正版漫画平台_知音漫客官网账号登录  期待已久:小米17 Ultra、小米首款NAS本月登场  Node.js中HTML按钮与J*aScript函数交互的正确姿势  抖音DOU+怎么投最有效 抖音付费推广的ROI提升技巧  如何在Promise链中有效终止错误处理后的执行  Surface怎么安装系统 微软Surface Pro U盘重装win11教程  抖音创作助手登录入口_抖音创作辅助工具官网直达  解决macOS Tkinter应用双击启动崩溃:PyInstaller打包指南  在Pyomo中实现基于变量的条件约束:Big-M方法详解  Win10如何恢复误删的快捷方式_Win10重建常用软件快捷方式  c++如何使用Catch2编写单元测试_c++简洁易用的BDD风格测试框架  Selenium Python中处理点击后新窗口加载冻结问题的策略与实践  《北京人工智能产业白皮书(2025)》发布:全年核心产值预计突破 4500 亿元  css元素hover动画延迟生效怎么办_使用animation-delay调整触发时间  Win11输入法不见了怎么办_Windows11恢复语言栏显示方法  Win10桌面图标出现小盾牌怎么办 Win10去除UAC图标教程【解决】  百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案  excel怎么制作工资条 excel快速生成工资条的方法  网易大神怎么保存别人动态的图片_网易大神动态图片保存方法  C++编译期如何执行复杂计算_C++模板元编程(TMP)技巧与应用  wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法  Golang并发任务中错误如何聚合_Golang goroutine error收集方式  漫蛙manwa2最新登录网址_漫蛙manwa2手机网页版入口  汽车之家官方网站官网入口_汽车之家网页版直接进入  必由学官网入口 必由学教师登录入口  Mac怎么查看崩溃日志_Mac控制台错误报告分析  如何在网页中实现特定地点的随机图片展示  AO3同人作品网入口 AO3搜索引擎官网永久地址  马斯克:Optimus 人形机器人复数形式为 Optimi  PHP高效扁平化嵌套数组:使用array_merge与数组解包操作符  Linux如何构建多环境配置管理_Linux多环境配置方案  Kafka Streams中基于消息头条件过滤消息的实现指南  Angular Material 垂直步进器:实现底部到顶部排序的教程  手机CPU怎么影响游戏体验_手机CPU对游戏性能的影响分析  照顾宝贝2小游戏点击立即在线玩  快手极速版在线观看 官方网页版登录地址  QQ邮箱电脑版登录入口_QQ邮箱官方网站登录平台  Composer的 "licenses" 命令如何帮助你遵守开源协议_检查项目依赖的许可证合规性  顺丰快递查询系统 官方正版查询入口 

搜索