千家信息网

如何去学习C++Coroutine

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,如何去学习C++Coroutine,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在C++里,一个函数如果其函数体实现中包
千家信息网最后更新 2026年10月31日如何去学习C++Coroutine

如何去学习C++Coroutine,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

在C++里,一个函数如果其函数体实现中包含co_await、co_yield、co_return中任何一个关键字,那么这个函数就是一个coroutine。其中:

co_await:挂起当前的coroutine
co_return:从当前coroutine返回一个结果
co_yield:返回一个结果并且挂起当前的coroutine

一个coroutine要能被编译期识别并通过编译,在某些情况下要自己去特化coroutine_traits。下面就一个简单的coroutine来说一说C++编译器是如何修改这个coroutine的。

// 我们假定这个模板函数是一个coroutinetemplate TRet func(TArgs args…){ body; // body里至少包含了co_await、co_yield、co_return三者之一。}

那么这个函数会被编译器改成如下形式:

// 它会被编译期展开成如下形式template TRet func(TArgs args...){ using promise_t = typename coroutine_traits::promise_type; promise_t promise; auto __return__ = promise.get_return_object(); // 这个__return__会被编译器特殊处理 co_await promise.initial_suspend(); try {   // co_return expr; => promise.return_value(expr); goto final_suspend;  body; // co_return;  => promise.return_void(); goto final_suspend; }   // co_yield expr; => co_await promise.yield_value(expr); catch (...) {  promise.set_exception(std::current_exception()); }final_suspend: co_await promise.final_suspend();}

以上是一个coroutine的基本形式。事实上看完之后会发现,一个coroutine的关键主要还是和其关联的promise。
和coroutine promise关联的另外一个概念,叫awaitable。Awaitable可以称为一个可等待对象。一个awaitable对象需要实现3个相关函数:

1、await_ready:awaitable实例是否已经ready

2、await_suspend:挂起awaitable。该函数会传入一个coroutine_handle类型的参数。这是一个由编译器生成的变量。suspend过程可以指定该coroutine何时何地以何种方式被resume。比方说实现suspend函数时,将coroutine_handle放到threadpool中。那么当前的coroutine接下来就运行在线程池指派的后台线程中运行了。

3、await_resume:当coroutine重新运行时,会调用该函数。

所以要让一个类型能够awaitable,有三种手段:

1、该类型相关代码无法修改时,需要实现:

bool await_ready(T &);
void await_suspend(T &, coroutine_handle);
auto await_resume(T &); auto视具体情况而定

2、该类型相关代码可以修改时,需要增加3个成员函数:

bool await_ready();
void await_suspend(coroutine_handle ch);
auto await_resume();

3、实现operator co_await操作符,返回一个可等待的代理类型,并且实现了上述三个函数。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

函数 编译 类型 编译器 形式 运行 学习 代码 关键 对象 情况 线程 结果 C++ 关联 帮助 清楚 特殊 接下来 三个 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 南京欣网互联网络科技 广东猪兼强互联网科技有限公司 哈尔滨大商圈互联网科技有限公司 科技互联网企业 互联网的科技 科技互联网项目 涨乐互联网科技 新华互联网科技学院 科技类互联网 广州互联网科技公司 狮子座互联网科技培训 深圳卡尔迅互联网科技有限公司怎么样 深圳前海聚择互联网科技有限公司 中国的互联网科技企业的崛起 新兴科技互联网创新大赛颁奖典礼 科技类公司包括互联网吗 广州新华互联网科技学校电竞方面 互联网科技圈年度人物 下一代互联网重大应用科技园 利用互联网等科技手段 互联网 的科技创新 互联网与新科技 深圳天众互联网科技公司 互联网 科技服务平台 哈尔滨秒房互联网科技有限公司 广州慧亚互联网科技怎么样 互联网科技有哪些公司 特约风豹互联网科技为什么扣费 互联网金融科技元年 求路客互联网科技电话
0