C++ coroutine 简单的例子

本文介绍了C++20中协程(coroutine)的使用,特别是Awaitable接口的实现。内容包括:1) `is_ready` 函数,用于检查协程是否已完成;2) `await_suspend` 函数,接收编译器生成的协程句柄以挂起和恢复执行;3) `await_resume` 函数,定义协程恢复时的返回值。通过理解这些概念,读者能够更好地掌握C++20协程的运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include <thread>
#include <coroutine>
#include <chrono>
#include <functional>

// g++-10 -std=c++2a coroutineDemo.cpp -fcoroutines -lpthread

using call_back = std::function<void(int)>;
void Add100ByCallback(int init, call_back f) // 异步调用
{
	std::thread t([init, f]() {
		std::this_thread::sleep_for(std::chrono::seconds(5));
		f(init + 100);
		});
	t.detach();
}

struct Add100AWaitable
{
	Add100AWaitable(int init) :init_(init) {}
	bool await_ready() const { return false; }
	int await_resume() { return result_; }
	void await_suspend(std::coroutine_handle<> handle)
	{
		auto f = [handle, this](int value) mutable {
			result_ = value;
			handle.resume();
		};
		Add100ByCallback(init_, f); // 调用原来的异步调用
	}
	int init_;
	int result_;
};

struct Task
{
	struct promise_type {
		auto get_return_object() { return Task{}; }
		auto initial_suspend() { return std::suspend
### C++ 协程的使用示例 以下是基于提供的引用以及相关知识构建的一个完整的 C++ 协程示例。此示例展示了如何定义一个返回 `int` 类型的任务,并通过协程机制完成任务。 #### 定义一个简单的 Task 结构体 下面是一个典型的 `Task<int>` 实现,它利用了 C++20 中引入的标准库特性来支持协程: ```cpp #include <coroutine> #include <iostream> struct Task { struct promise_type { int value; auto get_return_object() { return Task{std::coroutine_handle<promise_type>::from_promise(*this)}; } auto initial_suspend() { return std::suspend_always{}; } auto final_suspend() noexcept { return std::suspend_always{}; } void unhandled_exception() {} void return_value(int val) { value = val; } }; using handle_type = std::coroutine_handle<promise_type>; explicit Task(handle_type h) : coro(h) {} ~Task() { if (coro) { coro.destroy(); } } bool done() const { return !coro || coro.done(); } void resume() { coro.resume(); } int getValue() { return coro.promise().value; } private: handle_type coro; }; ``` #### 使用协程创建一个简单函数 以下代码展示了一个返回整数的协程函数: ```cpp Task simple_coroutine() { co_await std::suspend_always{}; co_return 42; } ``` #### 主程序调用协程并获取其结果 最后,在主程序中可以这样调用上述协程函数: ```cpp int main() { auto task = simple_coroutine(); while (!task.done()) { task.resume(); } std::cout << "Result from coroutine: " << task.getValue() << std::endl; return 0; } ``` 以上代码片段解释了如何定义和使用一个简单的协程结构[^1]。该例子涵盖了从定义到实际使用的整个过程,包括处理暂停点 (`co_await`) 和最终返回值 (`co_return`) 的逻辑。 --- ### 关键概念说明 - **Promise Type**: 每个协程都有与其关联的 Promise 类型,用于管理协程的状态和行为。例如,如果协程被定义为 `task<float> foo(std::string x, bool flag)`,那么它的 Promise 类型将是 `std::coroutine_traits<task<float>, std::string, bool>::promise_type`。 - **Suspend Points**: 协程可以通过 `co_await` 表达式在某些操作处挂起自身的执行,直到满足特定条件后再恢复运行。这使得复杂的异步操作能够以同步的方式编写[^3]。 - **Finalization**: 当协程结束时,会触发 `final_suspend()` 方法,允许开发者清理资源或执行其他必要的收尾工作[^1]。 尽管协程提供了强大的功能,但也存在一些局限性,比如调试难度较大、不同编译器之间的实现可能存在差异等问题[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值