C++20 中的协程:实战案例与最佳实践

协程(Coroutine)是 C++20 为解决异步编程而引入的重要特性。相比传统的回调和 Promise 机制,协程能够让你用同步的语法来编写异步代码,使代码更易读、易维护。下面将通过一个完整的实战案例,带你从零开始掌握协程的基本使用、实现方式以及一些常见的最佳实践。

1. 协程的基本概念

协程的核心是两个关键词:co_awaitco_return(以及 co_yield)。在协程函数内部,co_await 表示挂起当前协程并等待一个异步操作完成;co_return 用于返回协程的最终值。协程本质上是一个可以被暂停和恢复的函数,编译器会把它拆分成多个状态机的生成代码。

2. 简单的异步 I/O 协程

下面给出一个利用 C++20 标准库 `

` 与 `std::async` 模拟的异步 I/O 协程。实际生产环境中,你可能会使用网络库(如 Boost.Asio、libuv 等)来提供真正的异步 I/O。 “`cpp #include #include #include #include #include // 一个简单的 Awaitable 类型,模拟异步等待 struct SleepAwaitable { std::chrono::milliseconds duration; SleepAwaitable(std::chrono::milliseconds d) : duration(d) {} bool await_ready() const noexcept { return false; } // 总是挂起 void await_suspend(std::coroutine_handle h) const { // 创建一个后台线程来等待 duration 后恢复协程 std::thread([h, d = duration]() mutable { std::this_thread::sleep_for(d); h.resume(); }).detach(); } void await_resume() const noexcept {} // 无返回值 }; // 协程函数,返回 std::future auto async_add(int a, int b) -> std::future { std::cout std::future> { std::cout results; results.push_back(f1.get()); // get() 会阻塞直到结果可用 results.push_back(f2.get()); results.push_back(f3.get()); std::cout std::future { co_await SleepAwaitable(std::chrono::milliseconds(100)); throw std::runtime_error(“Something went wrong”); co_return 0; // 该行永远不会执行 } int main() { auto fut = error_demo(); try { fut.get(); } catch (const std::exception &e) { std::cout

发表评论