C++20协程——最简单的协程

一个函数返回了"协程接口",那么这个函数就是一个协程。

协程接口要求必须有promise_type。(awaitable是另外的,非必须。)

协程句柄(代表协程)是编译器负责创建的,我们只管用就行了。

最小化示例如下:

cpp 复制代码
#include <coroutine>

#include <iostream>

struct CoroutineInterface {
	struct promise_type {
		CoroutineInterface get_return_object() {
			return CoroutineInterface(std::coroutine_handle<promise_type>::from_promise(*this));
		}
		auto initial_suspend() {
			return std::suspend_always();
		}

		auto final_suspend()noexcept {
			return std::suspend_always();
		}
		void return_void() noexcept {

		}
		void unhandled_exception() {
			std::terminate();
		}
	};

	CoroutineInterface(std::coroutine_handle<promise_type> co_handle) {
		co_handle_ = co_handle;
	}

	std::coroutine_handle<promise_type> co_handle_;
};

CoroutineInterface GetNumbers() {
	// co_wait initial_suspend();
	for (int i = 0; i < 8; ++i) {
		std::cerr << i << "\n";
		co_await std::suspend_always();
	}
	// co_wait final_suspend();
	co_return;
}
int main(void) {

	CoroutineInterface co_interface = GetNumbers();
	while (!co_interface.co_handle_.done()) {
		std::cerr << "resume:";
		co_interface.co_handle_.resume();
	}
	std::cerr << "successfully end\n";
	return 0;
}

函数(协程)执行时,编译器会在代码块最前面执行cowait initial_suspend(),并且在函数co_return之前(或者在异常跳出之前)执行cowait final_suspend()。

initial_suspend()和final_suspend()是标准库提供的两个awaitable(可等待体)。

initial_suspend()和final_suspend()分别用于控制协程开始、协程即将结束时是否要挂起(挂起后会转移执行权,可以转移给调用者,或者其他协程)。

相关推荐
SunkingYang8 天前
C++20 vs C++17:新特性对比与用法指南
c++·c++20·特性·版本·新特性·对比·c++17
前进吧-程序员8 天前
C++20 协程入门实战:从 co_await 到一个 100 行的异步任务调度器
网络·c++·c++20
前进吧-程序员8 天前
实战:C++20 协程 + io_uring 写一个 400 行的 echo server
网络·c++·c++20
骑着蜗牛撵大象3279 天前
C++20 协程 × 屏障:手写一个 co_await 版 Barrier,让等待不再钉死线程
android·c++20·协程·并发编程·co_await·屏障同步
闻缺陷则喜何志丹10 天前
【c++20】协程与屏障
c++·算法·c++20·携程·屏障
努力努力再努力wz11 天前
【C++高阶系列】C++20 协程底层原理:函数为什么能暂停?从状态机到 Task,彻底串起挂起、恢复与协程调度
开发语言·c++·c++20·1024程序员节
fpcc22 天前
c++20新功能—std::osyncstream
c++·c++20
啦啦啦啦啦zzzz1 个月前
一致性哈希
服务器·算法·哈希算法·c++20·分布式存储
keep intensify1 个月前
C++20线程池
c++·算法·c++20
繁华的地方不一定留下你的脚印1 个月前
C++20 concepts:把模板要求写在入口,而不是等一屏报错
c++20