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

渡劫 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,Google 开发者专家(Kotlin 方向);《深入理解 Kotlin 协程》 作者(机械工业出版社,2020.6);《深入实践 Kotlin 元编程》 作者(机械工业出版社,2023.8);前腾讯高级工程师,现就职于猿辅导