程序笔记   发布时间:2022-05-30  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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的。

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

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

// 它会被编译期展开成如下形式
template <typename TRet,typename ... TArgs>
TRet func(TArgs args...)
{
 using promise_t = typename coroutIne_Traits<TRet,TArgs...>::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<promise_type>);
auto await_resume(T &);  auto视具体情况而定

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

bool await_ready();
voID await_suspend(coroutIne_handle<promise_type> ch);
auto await_resume();

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

大佬总结

以上是大佬教程为你收集整理的C++ Coroutine简单学习教程全部内容,希望文章能够帮你解决C++ Coroutine简单学习教程所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: