C++20 特性 协程 Coroutines(1)攻略
协程是C++20新增的一种编程语言特性,可用于异步编程,可以替代传统的回调、线程等异步编程方式,用于解决利用多核CPU或者异步I/O时出现的瓶颈,提高应用程序的性能。
协程的概述
协程是指一种在函数中使用的、可以在执行中暂停和继续的计算机程序组件。简单的说,协程就是可以在函数内通过暂停/恢复来提高程序性能的一种编程语言特性。
协程有两个关键的操作:暂停和恢复。暂停时将函数的状态保存下来并退出,等到再次调用时再恢复保存的状态并继续执行下去。通过这种方式实现了在函数内部建立一个事件循环,通过简单地暂停/恢复来实现“协作式多任务处理”。
协程的基本语法
在C++中,协程通过co_await
、co_yield
关键字来实现。其中co_await
用于等待协程的执行结果,co_yield
用于将控制权交回给调用者并返回执行结果。
#include <coroutine>
#include <iostream>
class Generator {
public:
struct promise_type; //coroutine需要的类型
using handle_type = std::coroutine_handle<promise_type>; //协程句柄
Generator(handle_type h)
: handle_(h)
{
}
Generator(const Generator&) = delete;
Generator(Generator&& other) noexcept //移动构造函数
: handle_(other.handle_)
{
other.handle_ = nullptr;
}
~Generator()
{
if (handle_)
handle_.destroy(); //销毁协程
}
Generator& operator=(const Generator&) = delete;
Generator& operator=(Generator&& other) noexcept
{
if (this != &other) {
if (handle_)
handle_.destroy();
handle_ = other.handle_;
other.handle_ = nullptr;
}
return *this;
}
int operator()()
{
handle_.resume(); //通过resume函数开始执行协程
return handle_.promise().current_value; //返回当前协程的值
}
private:
handle_type handle_;
};
struct Generator::promise_type {
int current_value;
Generator get_return_object()
{
return Generator{ handle_type::from_promise(*this) }; //获得协程句柄
}
auto initial_suspend() { return std::suspend_always{}; }
auto final_suspend() { return std::suspend_always{}; }
void unhandled_exception() { std::terminate(); } //应对异常
std::suspend_always yield_value(int value) //协程执行过程中,通过yield_value交还当前值
{
current_value = value;
return {};
}
};
Generator cofunc()
{
co_yield 1; // 协程的第一次,即第一个数
co_yield 2; // 第二个数
co_yield 3; // 第三个数
}
int main()
{
Generator g = cofunc();
std::cout << g() << std::endl; // 输出 1
std::cout << g() << std::endl; // 输出 2
std::cout << g() << std::endl; // 输出 3
return 0;
}
在main函数中通过Generator cofunc()来获得一个协程句柄,通过该句柄可以通过调用()来执行协程,执行过程中调用co_yield交回控制权,返回执行结果。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++20 特性 协程 Coroutines(1) - Python技术站