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

 更新时间:2025年12月15日 09:06:01   作者:华丽的周遭  
在C++11中引入的std::async是一个用于异步执行任务的工具,它简化了多线程编程的复杂度,本文就来详细的介绍std::async()的具体使用,感兴趣的可以了解一下

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

​​一、核心概念​​

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

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

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

std::async的声明如下:

template< class Function, class... Args >
std::future<typename std::result_of<Function(Args...)>::type>
    async( Function&& f, Args&&... args );
 
template< class Function, class... Args >
std::future<typename std::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. 最简用法(无显式策略)​​

template< class Function, class... Args >
std::future<typename std::result_of<Function(Args...)>::type>
    async( Function&& f, Args&&... args );
 
template< class Function, class... Args >
std::future<typename std::result_of<Function(Args...)>::type>
    async( std::launch policy, Function&& f, Args&&... args );
  • std::async(compute, 2, 3)启动异步任务,传递函数 compute和参数 2, 3
  • future.get()阻塞主线程,直到任务完成并返回结果。

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

// 强制异步执行(新线程)
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包装:

#include <functional>
 
void modify(int& value) {
    value = 100;
}
 
int main() {
    int x = 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 被修改)
 
    return 0;
}

​​五、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()时重新抛出:

int risky_compute(int x) {
    if (x < 0) throw std::runtime_error("x is negative");
    return x * 2;
}
 
int main() {
    auto future = std::async(risky_compute, -1);
    try {
        int result = future.get(); // 抛出 std::runtime_error
    } catch (const std::exception& e) {
        std::cerr << "Error: " << e.what() << ""; // 捕获异常
    }
    return 0;
}

​​七、注意事项​​

  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提供结果获取和状态查询能力。合理使用其启动策略和异常处理机制,可有效提升代码的并发性能和可维护性。

到此这篇关于浅谈C++11 std::async()基础用法示例的文章就介绍到这了,更多相关C++11 std::async()内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言实现车辆出租管理系统

    C语言实现车辆出租管理系统

    这篇文章主要为大家详细介绍了C语言实现车辆出租管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • C++设计模式迪米特法则实例

    C++设计模式迪米特法则实例

    这篇文章主要为大家详细介绍了C++设计模式迪米特法则实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • C++ shared_ptr智能指针reset()使用示例详解

    C++ shared_ptr智能指针reset()使用示例详解

    这篇文章主要为大家介绍了C++ shared_ptr智能指针reset()使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • C语言函数多个返回值方式

    C语言函数多个返回值方式

    这篇文章主要介绍了C语言函数多个返回值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • C++实现堆排序示例

    C++实现堆排序示例

    这篇文章主要介绍了C++实现堆排序示例,全文运用大量代码完成堆排序,需要了解的朋友可以参考一下这篇文章
    2021-08-08
  • C++实现蓝桥杯竞赛题目---搭积木

    C++实现蓝桥杯竞赛题目---搭积木

    这篇文章主要介绍了C++实现蓝桥杯竞赛题目---搭积木,本篇文章通过题目分析列举公式进行分析算法,包含详细的图文,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++实现图形界面时钟表盘代码

    C++实现图形界面时钟表盘代码

    这篇文章主要介绍了C++实现图形界面时钟表盘代码,涉及坐标函数的应用及图形界面程序设计,需要的朋友可以参考下
    2014-10-10
  • C语言 图文并茂详解程序编译过程

    C语言 图文并茂详解程序编译过程

    C语言是一种编译型语言,需要把源文件进行编译之后才能运行,它的编译过程是:预处理:展开头文件、宏替换,去掉注释,条件编译;编译:检查语法,生成汇编;汇编:把生成的汇编文件汇编成机器码;链接:链接到一起生成可执行程序
    2022-04-04
  • 教你用C语言实现三子棋

    教你用C语言实现三子棋

    这篇文章主要为大家详细介绍了C语言实现简单三子棋程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • C++ 路径中./、../、/代表的含义

    C++ 路径中./、../、/代表的含义

    这篇文章主要介绍了C++ 路径中./、../、/代表的含义,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12

最新评论