C++20 引入了协程支持,使得协程成为了一种内置特性。在 C++ 中,协程的生命周期管理主要依赖于编译器和标准库的实现。协程的生命周期可以分为以下几个阶段:
创建(Creation):协程对象在创建时,会分配内存并初始化。这个阶段包括定义协程函数、创建协程对象等操作。
准备(Ready):协程对象创建完成后,会进入准备阶段。在这个阶段,协程的上下文(包括栈、寄存器等)会被设置好,等待被调度执行。
运行(Running):协程进入运行阶段后,会执行协程函数中的代码。在运行过程中,协程可能会遇到挂起点(如 co_await
、co_yield
或 co_return
),此时协程会暂停执行,将控制权交还给调度器。
结束(Termination):当协程函数执行完毕或者遇到未处理的异常时,协程会进入结束阶段。在这个阶段,协程对象会被销毁,释放分配的内存。
为了处理协程的生命周期,C++ 标准库提供了一些辅助函数和类,如 std::future
、std::promise
和 std::generator
。这些工具可以帮助你在协程之间传递数据,以及在协程完成时获取结果。
以下是一个简单的 C++20 协程示例,展示了如何使用 std::generator
来处理协程的生命周期:
#include <iostream>
#include <coroutine>
std::generator<int> simple_generator() {
std::cout << "Coroutine started" << std::endl;
for (int i = 0; i < 5; ++i) {
co_yield i;
}
std::cout << "Coroutine finished" << std::endl;
}
int main() {
for (auto value : simple_generator()) {
std::cout << "Received: " << value << std::endl;
}
return 0;
}
在这个示例中,simple_generator
是一个协程函数,它使用 co_yield
语句来暂停执行并返回一个值。在 main
函数中,我们使用范围基于的 for 循环来迭代协程生成的值。当协程执行完毕时,循环会自动结束。在这个过程中,协程的生命周期得到了妥善处理。