C++ async await

17 Mar 2025 | 4 分钟阅读

许多编程语言提供了一种称为 async/await 的语法特性,它允许在计算机程序中将 异步非阻塞过程 组织成类似于典型的同步方法。async 和 await 是一种编写异步代码的简单方法。

例如,运行一些计算并通过 I/O 获取一些数据。异步编程提高了响应能力,被描述为编写 多线程程序 的一种近似方法。

Async

  • 此关键字指定一个 异步函数
  • 当函数是异步的时,它在后台运行, 解放 调用方代码 执行其操作,而无需等待函数完成。

Await

  • 异步函数可以通过使用 await 关键字 来等待指定的异步操作完成。
  • 它允许您等待过程的结果,而 不会阻塞 主线程。

参数

1. 策略

启动策略由此 位掩码 值指示。

  • launch::async
    • 这种异步方法创建一个新线程来调用函数,将其视为已使用函数和参数创建,并使用返回的 future 访问共享状态。
  • launch::deferred
    • 它被推迟,并且函数调用被推迟到使用 get 或 wait 检索返回 future 的共享状态。在这种情况下,该函数被认为是已调用,并且不再被视为已推迟。返回 future 的共享状态在此特定调用返回时准备就绪。
  • launch::async|launch::deferred
    • 它是一个自动过程,函数在某个时刻自行选择策略。它取决于库的实现方式和系统的工作方式,通常会针对系统当前的并发可用性进行优化。

2. fn

  • 它是任何类型的 可移动构造函数对象、成员或其类实现 operator() 的函数的引用,该函数将闭包和函数对象考虑在内。
  • 在这种情况下,函数使用参数的衰减副本。作为 async 返回的 future 对象将达到的共享状态,fn 返回值被保留。

3. Args

  • argsfn 被视为模板参数。换句话说,如果参数是隐式推断的,它们将是参数的正确 左值/右值 引用类型。
  • 在这种情况下,一个具有在 fn 执行完成后准备就绪的共享状态的 future 对象将是返回值。函数 fn 返回的值(如果有)将是 future::get 成员 获得的值。即使从未访问过共享状态,如果选择了 launch::async,返回的 future 也与创建的线程的末尾相关联。在这种情况下,fn 的返回与 fn 的返回同步。因此,即使函数 fn 返回 void,其异步行为在此时也不会被忽略。
  • 当使用 Args 类型参数调用函数时,它返回一个 result_of::type 类型。

示例

让我们举一个例子来确定 async 和 await 在 C++ 中的使用。

输出

C++ async await

好处

在 C++ 中,使用 asyncawait 具有以下优点

1. 更好的可读性

异步代码变得更容易理解和维护,因为它更具可读性,并且类似于同步代码。

2. 并发控制

Await 有助于管理并发并防止数据竞争,确保异步函数在它所等待的任务完成之前不会开始。

3. 更容易处理错误

由于调用代码可以处理异步函数中 抛出的异常,因此处理异步代码中的错误更简单。

4. 改进的调试

调试更容易,因为异步代码具有更可靠、更像同步的流程。

5. 改进的资源利用

异步代码可以通过更好地利用系统资源来提高多线程程序的性能。