挂起-上和挂起-下协程有什么区别?

3
2个回答

3
术语似乎在p0099r1:“一种用于堆栈式上下文切换的低级API”中有解释:
关于挂起上下文术语的注释 suspend-up 和 suspend-down 这两个术语是在论文 N4232 2 中引入的,并在 P0158 9 中继续使用,以区分无栈(suspend-up)和有栈(suspend-down)上下文切换。这些术语依赖于 C++ 函数调用操作的特定可视化,其中调用函数向下传递控制,而从函数返回向上传递控制。作者建议使用 "suspend-by-return" 代替 "suspend-up",并使用 "suspend-by-call" 代替 "suspend-down"。推荐的术语直接参考了底层的 C++ 操作,而不需要特定的可视化。 "suspend-by-return"("suspend-up" 或“无栈”上下文切换)基于从被调用函数返回控制到其调用者,同时带有一些指示,表明被调用函数是否已完成并返回结果,还是仅暂停并期望再次被调用。如果被调用函数挂起,则它的主体以这样的方式编码,即如果再次调用它,则会将控制权定向到它最后返回的点。这描述了 P0057 6 可恢复函数和早期技术(例如 Boost.Asio 协程)。 "suspend-by-call"("suspend-down" 或“有栈”上下文切换)基于调用一个函数,该函数透明地切换到其他逻辑的函数激活记录链。 (这可能是连续的堆栈区域,也可能不是。处理器的堆栈指针寄存器(如果有)可能涉及,也可能不涉及。)这描述了 N4397 3 协程以及 Boost.Context、13 Boost.Coroutine2 14 和 Boost.Fiber 15。std::execution_context<> :: operator()()需要 suspend-by-call 语义。
两篇论文都比较陈旧,与主要的协同程序论文p0057是分开的。p0444讨论了试图统一这些论文,但似乎没有任何进展。另请参见Trip Report: C++ Standards Meeting in Issaquah, November 2016,其中提到:

协程TS包含co_await提案,基于Microsoft的原始设计。

如前所述,目前正在进行努力,以标准化不同的、有栈式风格的协程提案,以及一个探索性的努力,将两种风格统一到一个公共的语法下。然而,这些提案目前并不打算针对协程TS。它们可能会针对不同的TS(如果出现统一的语法,那么它可能是最终合并到C++标准中的语法,而不是协程TS中的语法)。


同样相关的是 https://dev59.com/i14b5IYBdhLWcg3wiiR4 - sdgfsdh

0

每个函数都会创建一个堆栈帧(为本地变量等在堆栈上保留空间)

suspend-up:

  • 用于无栈上下文切换(协程...)
  • 因为您只有一个堆栈(应用程序堆栈),所以必须删除挂起函数的堆栈帧(无栈协程的函数)
  • 否则,在协程挂起后执行的其他函数将编写自己的堆栈帧,从而破坏挂起函数的堆栈帧
  • suspend-up == 删除挂起函数的堆栈帧 == 在堆栈向上步进一些地址(对于堆栈从高地址向低地址增长的体系结构)

suspend-down:

  • 用于有栈上下文切换(协程、纤程等)
  • 每个协程/纤程都有自己的堆栈,因此应用程序由多个堆栈组成
  • 如果挂起有栈协程,则堆栈帧仍保留在堆栈上(因为该堆栈特定于/由协程拥有)
  • 堆栈指针只是更改为另一个堆栈(== 切换到另一个有栈协程/纤程)
  • 因为堆栈帧仍保留在堆栈上,所以称为 suspend-down

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接