【发布时间】:2019-04-16 22:10:49
【问题描述】:
C++ 社区目前正在讨论挂起与挂起协程。
例如本提案中提到了暂停:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4453.pdf
这两个词是什么意思?
【问题讨论】:
C++ 社区目前正在讨论挂起与挂起协程。
例如本提案中提到了暂停:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4453.pdf
这两个词是什么意思?
【问题讨论】:
p0099r1: "A low-level API for stackful context switching" 中似乎解释了该术语:
关于挂起和挂起术语的说明 术语挂起 和suspend-down在论文N4232 2中被介绍并继续推进 在 P0158 9 中区分 stackless (suspend-up) 和 stackful ( 暂停)上下文切换。这些条款依赖于特定的 C++ 函数调用操作的可视化,其中调用 函数“向下”传递控制,而从函数返回 “向上”传递控制权。作者推荐的条款 suspend-by-return 而不是 suspend-up ,而suspend-by-call
暂停。推荐的术语直接引用 底层 C++ 操作,无需特定的 可视化。
suspend-by-return(suspend-up,或“无堆栈”上下文 切换)基于将控制权从被调用函数返回到其 调用者,以及一些关于是否调用函数的指示 已完成并正在返回结果或只是暂停和 预计会再次被调用。被调用函数的主体编码为 这样 - 如果它暂停 - 再次调用它会指示 控制到它最后返回的点。这既描述了 P0057 6 个可恢复功能和早期技术,例如 Boost.Asio 协程。 12
suspend-by-call(suspend-down,或 “堆栈式”上下文切换)基于调用一个函数,该函数, 对其调用者透明,切换到其他逻辑链 功能激活记录。 (这可能是也可能不是连续的 堆栈区。处理器的堆栈指针寄存器(如果有)可能或可能 不参与。)这描述了 N4397 3 协程以及 Boost.Context、13 Boost.Coroutine2 14 和 Boost.Fiber。 15 std::execution_context::operator()() 需要调用挂起 语义。
两者都是旧论文,与 p0057 分开,这似乎是主要的协程论文。 p0444 讨论了试图统一这些论文,但似乎没有任何进展。另请参阅Trip Report: C++ Standards Meeting in Issaquah, November 2016,其中说:
Coroutines TS 包含 co_await 提案,基于 Microsoft 的原始设计。
如前所述,目前正在努力对一种不同的、可堆叠的协程风格的提案进行标准化,以及在共同语法下统一这两种风格的探索性工作。然而,这些提案目前并未针对 Coroutines TS。相反,它们可能针对不同的 TS(如果出现统一的语法,可能是该语法,而不是 Coroutines TS 中的语法,最终合并到 C++ 标准中)。
每个函数都创建一个堆栈帧(为局部变量等保留堆栈空间)
暂停:
暂停:
【讨论】: