C++20中的协程(Coroutine)功能解析:co_await
📅 2026/7/15 14:26:04
👁️ 阅读次数
📝 编程学习
协程的概念
C++20引入了协程(coroutine)的概念,首先介绍下什么是协程: 协程是一个可以暂停执行以便稍后恢复的函数。但与函数不同的是协程是无堆栈的:它们通过返回调用者(caller)来暂停执行,恢复执行所需的数据与堆栈分开存储。这允许异步执行顺序代码(例如,在没有显式回调的情况下处理非阻塞I/O),并且还支持延迟计算无限序列和其他用途的算法。
也就是说,通常一个函数的函数体是顺序执行的,只有执行完才会将结果返回给调用者,而对于无栈的协程,可以把函数挂起,然后在任意需要的时刻恢复并执行函数体。
协程的主要优点
协程可以说是进程和线程的升级版,进程和线程切换都会有内核态和用户态的切换,而协程则是用户自己控制切换的时机,并不需要切换至内核态,所以这样以来执行效率非常高。因为程序的切换没有线程切换的开销,并且由于只有一个线程,也不存在同时读写变量的冲突,在协程中控制共享资源不需要加锁,只需要判断数据的状态,故执行效率远高于线程。特别是针对多核的情况,可以使用多进程+协程的方式尽可能提高效率。
协程的使用
一个函数如果想成为一个协程,可通过使用co_return,co_await或者co_yield这三个关键自来实现。
官方实例
官方实例,要求g++版本>=10.0,需要支持C++20。
#include <coroutine> #include <iostream> struct promise; struct coroutine : std::coroutine_handle<promise> { using promise_type = ::promise; }; struct promise { coroutine get_return_object() { return {coroutine::from_promise(*this)}; } std::suspend_always initial_suspend() noexcept { return
编程学习
技术分享
实战经验