
C++20 引入了原生协程支持,让异步编程更直观。要使用 C++20 协程,需满足三个关键条件:函数包含 co_await、co_yield 或 co_return 关键字;返回类型具有协程 traits(即符合协程接口);编译器开启 C++20 支持。
启用协程环境
确保你的编译器支持 C++20 协程,并在编译时启用 C++20 标准:
- GCC:使用 -std=c++20 且版本 ≥ 11
- Clang:≥ 14 版本并启用 -std=c++20
- MSVC:Visual Studio 2019 及以上,默认支持
定义协程返回类型
C++20 协程需要一个符合规范的返回类型,通常包括 promise_type。常见做法是自定义一个 task 或 generator 类型。
例如,实现一个简单的 generator 类型用于产生值:
立即学习“C++免费学习笔记(深入)”;
struct generator { struct promise_type { int current_value; suspend_always initial_suspend() { return {}; } suspend_always final_suspend() noexcept { return {}; } generator get_return_object() { return generator{this}; } void return_void() {} suspend_always yield_value(int value) { current_value = value; return {}; } void unhandled_exception() { std::terminate(); } };struct iterator {
promise_type* p;
bool done;
iterator& operator++() {
done = !co_await_handle(p);
return *this;
}
int operator*() const { return p->current_value; }
bool operator!=(std::default_sentinel_t) const { return !done; }
};
promise_type* p;
iterator begin() { return {p, false}; }
std::default_sentinel_t end() { return {}; }};
编写协程函数
使用 co_yield 返回一系列值:
易优游戏竞技公司网站源码是基于易优cms开发,非常适游戏竞技公司当做官网使用、 程序内核为Thinkphp5.0开发,后台简洁,为企业网站而生。 这是一套安装就能建站的c程序,不定期更新程序BUG,更新网站功能。 我们提供的不仅是模板这么简单,我们还提供程序相关咨询、协助安装等服务。默认不包含小程序插件,需要另外单独购买插件。 模板安装步骤 1、请将安装包ZI
调用方式:
for (int i : range(1, 5)) { std::cout使用 co_await 实现异步等待
可以结合 std::suspend_always 和自定义 awaiter 实现异步操作。
struct async_op { bool await_ready() { return false; } void await_suspend(std::coroutine_handle h) { // 模拟延迟执行 std::thread([h]() { std::this_thread::sleep_for(std::chrono::seconds(1)); h.resume(); }).detach(); } void await_resume() {} };task do_something() { std::cout
注意:task 是另一个常见的协程返回类型,需自行定义或使用第三方库(如 cppcoro)简化开发。
基本上就这些。C++20 协程核心在于理解 promise_type、handle 和 awaiter 三者协作机制。虽然标准未提供通用 task/generator,但通过自定义类型可灵活实现所需行为。










