在 C++20 标准中,协程(coroutines)被正式纳入语言核心,提供了一种简洁而强大的方式来编写非阻塞异步代码。本文将从协程的底层实现机制入手,阐述其核心概念,随后展示几个实际应用场景,并给出完整可编译的代码示例。
1. 协程基础概念
1.1 关键字
co_await:挂起协程,等待一个awaitable对象完成。co_yield:从协程生成一个值,挂起执行,直到下一个co_await或co_return。co_return:结束协程并返回一个值。
1.2 Awaitable
任何满足以下特性的对象都可以作为 co_await 的目标:
await_ready()→bool,判断是否立即完成。await_suspend(coroutine_handle)→void或bool,挂起协程并可能返回是否继续挂起。await_resume()→ 结果类型,协程恢复时返回值。
2. 协程的生成器(Generator)实现
下面给出一个简单的 `generator
`,演示协程如何在内部维护状态并逐个返回值。 “`cpp #include #include #include #include template class generator { public: struct promise_type { T current_value; std::exception_ptr eptr; generator get_return_object() { return generator{std::coroutine_handle ::from_promise(*this)}; } std::suspend_always initial_suspend() noexcept { return {}; } std::suspend_always final_suspend() noexcept { return {}; } std::suspend_always yield_value(T value) { current_value = std::move(value); return {}; } void return_void() {} void unhandled_exception() { eptr = std::current_exception(); } }; using handle_type = std::coroutine_handle ; explicit generator(handle_type h) : coro(h) {} ~generator() { if (coro) coro.destroy(); } bool next() { if (!coro.done()) coro.resume(); return !coro.done(); } T value() const { return coro.promise().current_value; } private: handle_type coro; }; “` ### 2.1 使用示例 “`cpp generator fibonacci(int n) { int a = 0, b = 1; for (int i = 0; i #include #include struct sleep_awaitable { std::chrono::milliseconds duration; bool await_ready() const noexcept { return duration.count() h) const { std::thread([h, d=duration]{ std::this_thread::sleep_for(d); h.resume(); }).detach(); } void await_resume() const noexcept {} }; generator countdown(int start, std::chrono::milliseconds step) { for (int i = start; i >= 0; –i) { co_yield i; co_await sleep_awaitable{step}; } } int main() { for (auto v : countdown(5, std::chrono::milliseconds(500))) { std::cout ` | 任务返回 `future` 或 `task`,可链式调用 | | UI 异步 | `co_await` + `sleep_awaitable` | 模拟动画帧更新 | | I/O 操作 | `asio` + C++20 协程 | 直接使用 `co_await` 处理异步 I/O | — ## 6. 结语 C++20 的协程为现代 C++ 带来了简洁的异步编程模型,消除了回调地狱和手工状态机的痛点。通过理解其底层实现原理(promise、awaitable、suspend/resume),开发者可以在保持代码可读性的同时,写出高效、可维护的异步代码。欢迎尝试上述示例,并根据业务需求扩展更复杂的协程框架。