【翻译】C++ Coroutines: Understanding Symmetric Transfer
这是Lewis Baker讲解协程的第四篇。这是原作者时隔2年后的文章,第一部分从简单例子中介绍并回顾之前的例子,从例子中引出无限递归会导致的栈溢出问题,然后第二部分介绍对称转移协程的设计以及是如何解决这个问题的。
本篇进一步从例子中来讲述实现协程的方式。
原文:https://lewissbaker.github.io/2020/05/11/understanding_symmetric_transfer
- 第一篇 Coroutine Theory
- 第二篇 C++ Coroutines: understanding-operator-co-await
- 第三篇 C++ Coroutines: understanding-the-promise-type
协程提案提供了很方便的方式来按照同步的方式写异步代码。你只需要在合适的点带上co_await,然后编译器就会处理好协程的挂起、保存挂起点前后的状态,以及当操作完成时恢复协程。
然而,协程提案中,特别是早期的版本,有很大的局限性,在不仔细处理时会很容易导致栈溢出。并且为了避免栈溢出,你不得不引入额外的同步开销来安全的保障你的task<T>类型。
幸运的是,在2018年协程的设计对这做了修补,增加了一项对称转移(symmetric transfer)的能力,允许你挂起一个协程然后恢复另外一个协程而不需要任何额外的栈空间。该项能力消除协程提案中的关键限制,使得实现异步协程类型可以更简单且更高效,而不用牺牲为了防止栈溢出所需的安全保证。
本篇中我会尝试解释栈溢出问题,以及“对称转移”能力是如何解决该问题的。