
C++20 引入了原生协程支持,让异步编程更直观。要使用 C++20 协程,需满足三个关键条件:函数包含 co_await、co_yield 或 co_return 关键字;返回类型具有协程 traits(即符合协程接口);编译器开启 C++20 支持。
确保你的编译器支持 C++20 协程,并在编译时启用 C++20 标准:
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 返回一系列值:
generator range(int from, int to) { for (int n = from; n调用方式:
for (int i : range(1, 5)) { std::cout可以结合 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 << "开始...\n"; co_await async_op{}; std::cout << "完成!\n"; }
注意:task 是另一个常见的协程返回类型,需自行定义或使用第三方库(如 cppcoro)简化开发。
基本上就这些。C++20 协程核心在于理解 promise_type、handle 和 awaiter 三者协作机制。虽然标准未提供通用 task/generator,但通过自定义类型可灵活实现所需行为。
以上就是c++++怎么使用C++20的协程_c++ C++20协程使用方法的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号