1

渡劫 C++ 协程(10):后记

 2 years ago
source link: https://www.bennyhuo.com/2022/03/27/cpp-coroutines-10-postscript/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

渡劫 C++ 协程(10):后记

发表于 2022-03-27 更新于 2022-03-28 阅读次数: 3 本文字数: 1.5k 阅读时长 ≈ 3 分钟

渡劫 C++ 协程系列文章本来不在我的计划范围内。

相较于我常用的几门语言(可能是 Kotlin、Java、Python、JavaScript)来讲,我对 C++ 的熟悉程度并不是特别高。因此尽管群里的小伙伴们经常提议讲点儿 C++ 的内容(都出了一门 C 语言课了,还讲不了 C++?),考虑到精力和经验有限,我都拒绝了。

不过,人生就是那么奇妙,前不久我刚好有点儿时间,也正遇到群里有小伙伴们提到 C++ 协程,就硬着头皮看了一下午,录了一期视频 协程上手经典案例:实现一个序列生成器。既然有了第一期,那就得有第二期,结果越往后越感觉我这个讲法不太对。

过了一段时间之后,我的闲话 Swift 协程系列文章完结,同时我对 C++ 协程的认知也在不断加深,那么好吧,再写一系列 C++ 协程的文章吧。在学习 Swift 协程时,我可以翻阅 Swift 的语言设计文档以及源码,整个过程还算轻松,因此称为闲话 Swift 协程;C++ 的情况就不太一样了,设计文档看着令人头疼,标准库的源码又看得我眼花缭乱,于是得名渡劫 C++ 协程

我在最初做 Kotlin 协程的介绍的时候,很多朋友都在问我协程究竟能做什么,再后来不少读者在发现 Kotlin 协程的默认调度器居然是个线程池,于是就认为 “Kotlin 协程的本质就是个线程池” —— 这真的是让人哭笑不得。

为了让读者能够更加深刻的认识协程,我在《深入理解 Kotlin 协程》 这本书当中花了整整一章的篇幅介绍了常见语言对协程的支持情况,对比彼此之间的差异,甚至用 Kotlin 协程的基本 API 来模拟其他语言的协程特性。

Kotlin 的协程和 C++ 的协程在设计分层上有着惊人的相似之处,二者在标准库当中仅仅提供了为数不多的基本 API,想要将协程运用到业务实践当中还需要有协程框架的支持。C++ 20 已经走出了第一步,这大概相当于 Kotlin 1.1 时的状态。

我当时为了让读者能够深入理解 Kotlin 协程框架的设计,干脆自己动手实现了一个简版的协程框架 CoroutineLite。而渡劫 C++ 协程的核心内容也是在尝试通过自己实现 C++ 的协程框架来深入理解 C++ 协程。按照这个思路,我们还可以继续深入探索,例如实现 Task 的取消,为 Task 添加父子关系以实现结构化并发等等能力,只是受限于时间和精力,我决定暂时停止这一次奇妙的探索历程。

如果想要在生产环境当中使用 C++ 20 提供的协程,我们可能还需要持续关注 C++ 委员会后续对协程的规划和设计。让我们期待将来 C++ 新标准对协程提供更多的支持吧。


霍丙乾 bennyhuo,Kotlin 布道师,Google 认证 Kotlin 开发专家(Kotlin GDE);《深入理解 Kotlin 协程》 作者(机械工业出版社,2020.6);前腾讯高级工程师,现就职于猿辅导


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK