打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
协程那些事儿(一)--你好,协程

C++20的协程有很多人认为它是C++20最重要的特性,没有之一,因为它将在未来三到五年之内深远地影响着C++的异步编程模式,它让异步编程变得简单,它是未来的趋势,因此很有必要掌握C++20协程。

然而,C++20协程又是比较复杂的,它的概念多、细节多,学习起来不容易。网上也有很多关于协程的资料,但很多一开始就展示很多的协程细节和新的feature,并不适合入门,我计划从易于理解的角度介绍协程,争取让读者能比较容易入门(这也是仅仅是从我的角度来介绍,一家之言,仅供参考)。

本系列将深入浅出介绍协程,抽丝剥茧,让读者理解协程的概念、细节和用法,通过一些例子展示和如何使用协程,让读者最终掌握协程这一利器。

论c++的灵活性

公众号传不了,看原文中的图片吧(http://purecpp.org/detail?id=2267)

这张图用在协程上也很适合,协程为了实现足够灵活,在很多地方允许用户自定义行为,这往往会导致初学者很迷惑,无所适从。但是,当你熟悉协程之后你就会觉得这些灵活性又是多么好,让你可以控制协程的一切。

协程的概念

协程本质上是一个future,表示一个将被求值的对象。在概念上它和std::future很像,都由一个promise对象产生,future的值和状态都保存在promise中,所以在某种程度上你把它当作std::future/promise来理解也是可以的,当然协程的实现细节上比std::future/promise复杂得多。

协程和线程

协程和线程在行为上有一些相似之处,比如都可以表示一个异步的任务,但是不同之处在于创建一个协程的代价远小于线程,你可以轻易的创建百万计的协程,而线程则无法创建这么多,所以很多人把协程当作一个轻量级的线程使用。

协程和线程的相似之处也仅限于此了,因为协程的创建和运行和线程有很大的差别。线程创建之后,线程函数就由线程自动执行了,而协程创建之后并不会运行,需要通过co_await来将协程调度到某个线程中去执行(比如你可以把协程放到线程池中去执行),协程的执行一般在协程创建者之外的线程中执行,如果协程在创建者的线程中执行则会阻塞创建者线程。从这个角度来说协程并不能像线程那样具备运行的能力,它只能在线程中执行,因为它本质是一个有点特殊的函数而已。

协程和函数

前面说过协程只不过是有点特殊的函数,相比普通函数协程的特殊之处在于它可以暂停和恢复,如下图所示:

正式因为协程可以暂停和恢复,我们可以利用这一特点来简化异步编程,在挂起协程的时候调用异步函数,然后在异步函数的回调中恢复协程,协程会回到上次挂起协程的地方继续执行,这样我们的异步代码看起来就像同步代码一样,即用同步方式编写异步代码。

你好,协程

task hello_coroutine() {
co_return 42;
}

c++20中新增了三个关键字co_await、co_return和co_yield,只要一个函数中有这三个关键字之一,那么这个函数就是一个协程,所以上面这个hello_coroutine就是一个协程。可以看到协程的返回类型和return返回的类型并不一致,return返回的是一个int,而协程返回类型是一个task对象,这个task又是什么呢?为什么是这样的一个形态?看起来有点别扭是吗?这时候如果你把这个task想象成一个future就好理解了,因为协程代表的是一个未来的求值,所以需要返回一个future类似的对象。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Python异步编程模块asyncio学习
理解 asyncio 来构建高性能 Python 网络程序
Python黑魔法 --- 异步IO( asyncio) 协程
C++ 协程与网络编程 协程
微信异步化改造实践:8亿月活、单机千万连接背后的后台解决方案
C++11之std::future和std::promise
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服