扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
如何去学习C++Coroutine,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
创新互联长期为千余家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为铁西企业提供专业的成都网站设计、做网站,铁西网站改版等技术服务。拥有10年丰富建站经验和众多成功案例,为您定制开发。在C++里,一个函数如果其函数体实现中包含co_await、co_yield、co_return中任何一个关键字,那么这个函数就是一个coroutine。其中:
co_await:挂起当前的coroutine
co_return:从当前coroutine返回一个结果
co_yield:返回一个结果并且挂起当前的coroutine
一个coroutine要能被编译期识别并通过编译,在某些情况下要自己去特化coroutine_traits。下面就一个简单的coroutine来说一说C++编译器是如何修改这个coroutine的。
// 我们假定这个模板函数是一个coroutine templateTRet func(TArgs args…) { body; // body里至少包含了co_await、co_yield、co_return三者之一。 }
那么这个函数会被编译器改成如下形式:
// 它会被编译期展开成如下形式 templateTRet 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
auto await_resume();
3、实现operator co_await操作符,返回一个可等待的代理类型,并且实现了上述三个函数。
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联网站建设公司行业资讯频道,感谢您对创新互联建站的支持。
另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、建站服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流