小工具知识网

当前位置: 首页 > 行业知识 > 【C++11】std::async函数介绍及问题梳理

行业知识

【C++11】std::async函数介绍及问题梳理

2026-10-26 19:05:00 来源:互联网转载

目录

1. std::async 简介

2. 问题梳理

2.1 std::async(异步执行) 到 future get 直接调用会如何抛异常

2.2 std::async 如果通过劫持让 new 内存不够,有没有可能抛异常

2.3 std::async 如果系统线程不够有没有可能异常

3. gdb调试async详情

3.1 模拟调用 new 失败场景

3.2 模拟调用 linux api 失败场景


1. std::async 简介

std::async 是 C++11 标准库中用于异步执行的函数,会返回一个 std::future 对象,以获取函数的执行结果。可用其在新线程中执行函数,也可以在当前线程中执行。std::async 的函数声明形式通常如下:

template std::future     std::async(std::launch policy, F&& f, Args&&... args);

说明:

  • template :函数模板声明。F 是要执行的函数类型,Args... 是函数参数类型的模板参数包【这意味着函数可以接受任意数量的参数】

  • std::future:这是 std::async 函数的返回类型。它是一个 std::future 对象,包装了函数 F 的返回类型。std::future 允许在未来的某个时间点获取函数的执行结果。

  • std::async(std::launch policy, F&& f, Args&&... args):这是函数 std::async 的声明。它接受三个参数:

    • policy: std::launch 类型的参数,表示函数执行的策略,有如下2种:
      std::launch::async(在新线程中异步执行)
      std::launch::deferred(延迟执行,在调用 std::future::get() 或 std::future::wait() 时执行)。
    • f:通用引用(universal reference),表示要执行的函数对象。通用引用允许 f 接受任意类型的参数。
    • args:这是函数 f 的参数列表。可以是零个或多个参数。
  • 这个函数的作用是根据给定的执行策略异步执行函数 f,并返回一个 std::future 对象,可用来等待函数的执行完成并获取函数的结果。

    注意:

    std::async 的行为受到执行策略参数【 std::launch 类型的参数】的影响,可能在调用时立即执行,也可能延迟到 std::future::get() 或 std::future::wait() 被调用时才执行。


    2. 问题梳理

    2.1 std::async(异步执行) 到 future get 直接调用会如何抛异常

    std::async 到 std::future::get 直接调用会抛出异常,主要有两种情况:

    1. 函数对象抛出异常。
    2. 如果使用 std::launch::async 策略,并在调用 std::future::get 之前的函数执行抛出了异常,这种情况下会导致 std::future::get 抛出 std::future_error 异常。

    【示例1】函数对象抛出异常

    #include #include // 抛出异常void task1() {    throw std::runtime_error("An error occurred in task1()");}int main() {    try {        // 使用 std::async 启动一个异步任务        auto future1 = std::async(std::launch::async, task1);        // 等待异步任务的完成并获取结果        future1.get(); // 这里会抛出异常    } catch (const std::exception& e) {        std::cerr 

上一篇:直播视频服务器怎么连接?

下一篇:揭秘易语言数组清空技巧!