目录
C++20中的协程(Coroutine)
从2017年开始, 协程(Coroutine)的概念就开始被建议加入C++20的标准中了,并已经开始有人对C++20协程的提案进行了介绍。1事实上,协程的概念在很早就出现了,甚至其他语言(JS,Python,C#等)早就已经支持了协程。
可见,协程并不是C++所特有的概念。
那么,什么是协程?
简单来说,协程就是一种特殊的函数,它可以在函数执行到某个地方的时候暂停执行,返回给调用者或恢复者(可以有一个返回值),并允许随后从暂停的地方恢复继续执行。注意,这个暂停执行不是指将函数所在的线程暂停执行,而是单纯的暂停执行函数本身。
那么,这种特殊函数有什么用呢?最常见的用途,就是将“异步”风格的编程“同步”化。
比如,我们有一个请求webapi的库,然后在某个应用中我们需要发送一个http请求,然后等待web服务器反馈消息。恰巧的是,我们需要按顺序请求多次,比如,只有请求A返回了,我们才能发送请求B,因为请求B中包含请求A返回的结果。然后等请求B返回了,我们才能发送请求C等等。
我们不能阻塞主线程,那么此时我们应该怎么办?
最常见的思路就是开一个新线程,然后使用“回调函数”,例如:
// 示意代码
void requestA(int req, std::function<void(int)> cb)
{
// 我们的webapi是异步调用, 我们开启一个线程请求并等待调用完毕
std::thread t([req, cb]() {
auto response = webapi.request(req);
// 假定response有个等待返回值的接口waitForFinish,他会阻塞当前线程,直到拿到返回值
int rt = response.waitForFinish();
// 返回了, 那么我们调用回调函数
cb(rt);
});
t.detach();
}
假定我们还有相同结构的requestB,requestC以及其它, 那么我们会怎么用呢? 有了lamda表达式,通过回调函数进行链式调用可以很简单的写成如下形式:
int main()
{
requestA(1
C++20协程详解

C++20引入的协程概念允许开发者以同步方式编写异步代码,通过co_await关键字等待异步操作完成。协程并非C++独有,其他语言如JS、Python也已支持。协程函数需返回Promise类,并使用co_return、co_yield、co_await关键字。C++20协程需手动实现,自动化工具预计在C++23提供。
最低0.47元/天 解锁文章

1358

被折叠的 条评论
为什么被折叠?



