当前位置: 首页 > news >正文

浅谈C++11 std::async()基础用法示例

在 C++11 中引入的std::async是一个用于异步执行任务的工具,它简化了多线程编程的复杂度,通过返回std::future对象实现对异步任务结果的获取。

​​一、核心概念​​

std::async用于启动一个异步任务(可能在独立线程中执行),并返回一个std::future对象,通过该对象可以:

  • 阻塞等待任务完成并获取返回值(future::get());
  • 查询任务状态(future::valid()future::wait_for()等);
  • 异常传递(任务中的异常会延迟到get()时抛出)。

​​二、函数原型与启动策略​​

std::async的声明如下:

1

2

3

4

5

6

7

template<classFunction,class... Args >

std::future<typenamestd::result_of<Function(Args...)>::type>

async( Function&& f, Args&&... args );

template<classFunction,class... Args >

std::future<typenamestd::result_of<Function(Args...)>::type>

async( std::launch policy, Function&& f, Args&&... args );

其中第二个模板参数是​​启动策略​​(std::launch枚举),控制任务的执行方式:

策略

说明

std::launch::async

强制在新线程中异步执行任务(类似 std::thread直接启动)。

std::launch::deferred

延迟执行:任务不会立即启动,直到调用 future.get()或 wait()时才在当前线程同步执行。

默认策略(无显式指定)

实现定义(通常是 `async

​​三、基础用法示例​​

​​1. 最简用法(无显式策略)​​

1

2

3

4

5

6

7

template<classFunction,class... Args >

std::future<typenamestd::result_of<Function(Args...)>::type>

async( Function&& f, Args&&... args );

template<classFunction,class... Args >

std::future<typenamestd::result_of<Function(Args...)>::type>

async( std::launch policy, Function&& f, Args&&... args );

  • std::async(compute, 2, 3)启动异步任务,传递函数compute和参数2, 3
  • future.get()阻塞主线程,直到任务完成并返回结果。

​​2. 显式指定启动策略​​

1

2

3

4

5

6

7

8

// 强制异步执行(新线程)

auto future_async = std::async(std::launch::async, compute, 2, 3);

// 延迟执行(当前线程同步执行)

auto future_deferred = std::async(std::launch::deferred, compute, 2, 3);

future_async.get();// get()阻塞等待

future_deferred.get();// 此时在当前线程同步执行 compute(2,3)

​​四、参数传递与引用语义​​

std::async支持传递任意可调用对象(函数、Lambda、函数对象等)和参数。若需传递引用,需用std::ref包装:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

#include <functional>

voidmodify(int& value) {

value = 100;

}

intmain() {

intx = 0;

// 错误:直接传递引用会被复制(值语义)

// auto future = std::async(modify, x);

// 正确:用 std::ref 传递引用

auto future = std::async(modify, std::ref(x));

future.get();

std::cout << x << std::endl;// 输出 100(x 被修改)

return0;

}

​​五、std::future 的常用接口​​

std::async返回的std::future提供以下关键方法:

方法

说明

get()

阻塞直到任务完成,返回结果(或抛出任务中的异常);只能调用一次。

wait()

阻塞直到任务完成;可多次调用。

wait_for(timeout)

阻塞最多 timeout时间,返回 std::future_status(ready/timeout/deferred)。

wait_until(timepoint)

阻塞直到指定时间点。

valid()

检查 future是否关联有效结果(未调用 get()时为 true)。

share()

转换为 std::shared_future(允许多个对象共享结果)。

​​六、异常处理​​

异步任务中抛出的异常会被std::future捕获,直到调用get()时重新抛出:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

intrisky_compute(intx) {

if(x < 0)throwstd::runtime_error("x is negative");

returnx * 2;

}

intmain() {

auto future = std::async(risky_compute, -1);

try{

intresult = future.get();// 抛出 std::runtime_error

}catch(conststd::exception& e) {

std::cerr <<"Error: "<< e.what() <<"";// 捕获异常

}

return0;

}

​​七、注意事项​​

  1. ​生命周期管理​​:

    std::future析构时,若任务未完成且未被get()wait(),可能导致程序终止(取决于实现)。若需共享结果,使用std::shared_future

  2. ​线程复用​​:

    std::async不保证任务一定在新线程中执行(尤其是deferred策略或编译器优化),依赖具体实现。

  3. ​性能开销​​:

    相比手动管理std::threadstd::async自动管理线程生命周期,但频繁创建小任务可能有额外开销(适合中高耗时任务)。

​​八、典型应用场景​​

  • ​并行计算​​:同时执行多个独立任务(如图像处理中的多区域计算)。
  • ​异步IO​​:发起IO操作后异步等待结果,避免阻塞主线程。
  • ​任务编排​​:结合std::future::wait_for实现超时控制(如监控任务是否超时)。

​​总结​​

std::async是 C++11 中简化异步编程的核心工具,通过std::future提供结果获取和状态查询能力。合理使用其启动策略和异常处理机制,可有效提升代码的并发性能和可维护性。


http://www.cnnetsun.cn/news/2563976.html

相关文章:

  • 用互补晶体管模拟PUT实现纯模拟呼吸灯电路设计与调试
  • Claude Code , Codex, Curser, OpenCode 等 CodeAgent 的实现原理与应用深度研究
  • 如何用Electron打造终极番茄工作法应用:Pomolectron完整指南 [特殊字符]
  • StarRailAssistant:让《崩坏:星穹铁道》的重复操作变得智能高效
  • 技术深度解析:Beyond Compare 5密钥生成器实现原理与架构设计
  • 作为小白,C语言如何从零开始呢
  • 5分钟上手Vueify:Browserify+Vue开发环境快速搭建
  • 如何用Python脚本榨干百度网盘带宽:pan-baidu-download终极指南
  • 真正的人工智能理论:你的心,是如何理解世界的?——从内心的那把尺子说起(三)
  • 什么是Agent?一篇讲清楚
  • 【Nginx】深入理解 Nginx try_files:SPA 路由回退、静态资源兜底与零拷贝优化原理
  • 16个分片+2副本:pg_shard的master_create_worker_shards最佳实践
  • 从Arduino功率扩展板到CE/FCC认证产品:硬件创业全流程实战复盘
  • AI Agent 面试题 958:LangChain框架的核心架构和设计理念详解
  • Pearcleaner:macOS深度清理终极指南,彻底释放磁盘空间
  • 智能办公助手套件,支持Office、WPS各版本!内置大模型可智能对话!文档表格自动处理,文案提炼总结、内容校对、语句润色、文章续写生成、翻译、排版、PPT生成
  • ARM SME2 FMAX指令:浮点向量运算优化指南
  • 航空发动机叶片三维扫描-诺斯顿
  • 从CTF实战到日常开发:手把手教你用Python复现Rabbit算法加解密(附完整代码)
  • 私有化视频会议系统EasyDSS一个平台,搞定直播、点播、作业、统计—学校终于不用买多套系统了
  • 你越是爽快借钱给同事,同事就越不把你当回事
  • AI编程底层原理:上下文注入与专业角色切换,Skills让AI从“指令机器”变“思考专家”!
  • Scroll Reverser终极指南:彻底解决macOS滚动方向混乱问题
  • 风控系统如何全维度识别爬虫:IP、账号与行为的协同决策机制
  • 万字收藏!2026版从Function Calling到MCP再到Skills:AI工具调用的三次进化
  • 特定任务需求场景下的过约束并联机构构型设计与控制方法【附代码】
  • Upload-Labs-Linux
  • 告别书签混乱:3个步骤让你的浏览器收藏夹重获新生
  • 如何快速突破原神60帧限制:面向PC玩家的完整帧率解锁指南
  • DIY四路自动音频源切换器:从信号检测到继电器隔离的完整设计