浅谈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-03-03
  • 详解C++之类和对象(2)

    详解C++之类和对象(2)

    类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量;创建对象的过程也叫类的实例化。每个对象都是类的一个具体实例(Instance),拥有类的成员变量和成员函数
    2021-11-11
  • C语言的isatty函数和ttyname函数以及sendmsg函数用法

    C语言的isatty函数和ttyname函数以及sendmsg函数用法

    这篇文章主要介绍了C语言的isatty函数和ttyname函数以及sendmsg函数用法,是C语言入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • C语言 深入解读数据结构之堆的实现

    C语言 深入解读数据结构之堆的实现

    堆就是用数组实现的二叉树,所以它没有使用父指针或者子指针。堆根据“堆属性”来排序,“堆属性”决定了树中节点的位置
    2021-11-11
  • C语言实现生日贺卡

    C语言实现生日贺卡

    这篇文章主要为大家详细介绍了C语言实现生日贺卡的具体方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • 一文详解C语言中文件相关函数的使用

    一文详解C语言中文件相关函数的使用

    这篇文章主要为大家详细介绍了C语言中文件相关函数的使用,可以实现文件的读写、打开和关闭。文中通过示例进行了详细介绍,需要的可以参考一下
    2022-07-07
  • C++ String部分成员模拟实现流程详解

    C++ String部分成员模拟实现流程详解

    我们先不直接实现完整版的string,先实现简易版的string部分成员来基本了解下它的框架,以及以后来学习深浅拷贝的问题。这样有循序渐进的过程嘛
    2022-08-08
  • C++实现结束应用进程小工具

    C++实现结束应用进程小工具

    这篇文章主要为大家详细介绍了C++实现结束应用进程小工具,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • C++算法之在无序数组中选择第k小个数的实现方法

    C++算法之在无序数组中选择第k小个数的实现方法

    这篇文章主要介绍了C++算法之在无序数组中选择第k小个数的实现方法,涉及C++数组的遍历、判断、运算等相关操作技巧,需要的朋友可以参考下
    2017-03-03
  • C语言中的数组和指针汇编代码分析实例

    C语言中的数组和指针汇编代码分析实例

    这篇文章主要介绍了C语言中的数组和指针汇编代码分析实例,本文用一则C语言例子来得到对应的汇编代码,并一一注解每句汇编代码的含义,需要的朋友可以参考下
    2015-06-06

最新评论