C++ 面试题
目录

C++20 中协程 (coroutine) 的概念和用法?

· 约 4 分钟读完 · 第 141 / 181 章

推荐答案

在C++20中,协程(coroutine)是一种可以暂停和恢复执行的函数。协程允许函数在执行过程中暂停,并在稍后的时间点恢复执行,而不会丢失其状态。协程的核心概念包括以下几个部分:

  1. 协程函数:使用co_await、co_yield或co_return关键字的函数。
  2. 协程句柄:用于管理协程的生命周期和状态。
  3. 协程框架:由编译器生成的代码,用于管理协程的暂停和恢复。

示例代码

输出

本题详细解读

协程的基本概念

协程是一种可以暂停和恢复执行的函数。与普通函数不同,协程可以在执行过程中暂停,并在稍后的时间点恢复执行,而不会丢失其状态。这使得协程非常适合用于异步编程、生成器和状态机等场景。

协程的关键字

  • co_await:用于暂停协程的执行,直到某个条件满足。
  • co_yield:用于暂停协程并返回一个值,类似于生成器。
  • co_return:用于结束协程的执行并返回一个值。

协程的组成部分

  1. 协程函数:使用co_await、co_yield或co_return关键字的函数。协程函数的返回类型必须包含一个promise_type。

  2. promise_type:协程函数的返回类型必须包含一个嵌套的promise_type类型。promise_type定义了协程的行为,包括如何创建协程对象、如何暂停和恢复协程等。

  3. 协程句柄:std::coroutine_handle用于管理协程的生命周期和状态。通过协程句柄,可以手动控制协程的暂停和恢复。

  4. 协程框架:由编译器生成的代码,用于管理协程的暂停和恢复。协程框架负责保存协程的状态,并在协程恢复时恢复这些状态。

示例代码解析

在示例代码中,MyCoroutine结构体定义了一个简单的协程类型。promise_type定义了协程的行为,包括如何创建协程对象、如何暂停和恢复协程等。

myCoroutineFunc是一个协程函数,使用co_await暂停协程的执行。在main函数中,我们创建了一个协程对象,并通过协程句柄手动控制协程的暂停和恢复。

协程的应用场景

  • 异步编程:协程可以用于简化异步编程模型,避免回调地狱。
  • 生成器:协程可以用于实现生成器,生成一系列值。
  • 状态机:协程可以用于实现复杂的状态机,简化状态转换逻辑。

通过理解协程的基本概念和用法,可以在C++20中更好地利用协程来简化代码并提高程序的性能。