暂停和暂停协程有什么区别?

时间:2018-11-14 01:16:42

标签: c++ coroutine

C ++社区当前正在讨论暂停协程和暂停协程。

例如,此提案中提到了下架:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4453.pdf

这两个词是什么意思?

2 个答案:

答案 0 :(得分:3)

该术语似乎在Ionic Camera中进行了解释:

  

关于“暂停”和“暂停”术语的说明术语“暂停”   N4232 2 中引入了悬停和悬挂   在P0158 9 中区分无堆栈(suspend-up)和有堆栈(   暂停)上下文切换。这些术语取决于特定的   C ++函数调用操作的可视化,其中调用   函数将控制权“向下”传递,而从函数返回   将控制权“向上”传递。作者建议使用这些术语   返回挂起而不是suspend-up,而是挂起调用   的
  暂停。推荐的术语直接引用了   底层C ++操作,无需特定   可视化。
  暂停返回暂停悬浮或“无堆栈”上下文   切换)基于将控制权从被调用函数返回到其功能   调用方,以及有关是否已调用函数的一些指示   已经完成并正在返回结果,或者仅仅是暂停而已,   希望再次被调用。被调用函数的主体编码为   这样的方式-如果暂停-再次调用将直接   控制到最后返回的点。既描述了   P0057 6种可恢复功能和早期技术,例如   Boost.Asio协程。 12
  通话暂停通话暂停,或   “堆栈式”上下文切换)基于调用一个函数,   与调用方透明,切换到其他的逻辑链   功能激活记录。 (这可能是连续的,也可能不是连续的   堆栈区域。处理器的堆栈指针寄存器(如果有)可能会或可能会   不涉及。)这说明了N4397 3个协程以及   Boost.Context,13 Boost.Coroutine2 14 和Boost.Fiber。 15   std :: execution_context <> :: operator()()需要挂起调用   语义。

它们都是旧文件,并且与p0099r1: "A low-level API for stackful context switching"(似乎是主要的协程文件)分开。 p0444讨论了如何统一这些论文,但似乎没有任何地方。另请参见p0057,其中指出:

  

Coroutines TS包含基于微软原始设计的co_await提议。

     

如前所述,目前正在努力标准化针对协程不同,堆叠式风味的提案,并进行探索性努力以统一语法统一这两种风味。但是,这些提议目前尚未针对Coroutines TS。他们可能会针对另一种TS(如果出现统一语法,则可能是该语法,而不是Coroutines TS中的语法,最终被合并为C ++标准)。

答案 1 :(得分:0)

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

暂停:

  • 用于无堆栈上下文切换(协程...)
  • 因为只有一个堆栈(应用程序堆栈),所以您必须删除已暂停功能(无堆栈协程的功能)的堆栈框架
  • 否则,在协程被挂起之后执行的其他函数将写入它们自己的堆栈框架,从而破坏被挂起的堆栈的堆栈框架
  • suspend-up ==删除已暂停函数的堆栈框架==向上递增堆栈中的某些地址(对于堆栈从高地址到低地址的架构)

暂停:

  • 用于堆栈上下文切换(协程,光纤等)
  • 每个协程/光纤都有自己的堆栈,因此应用程序由多个堆栈组成
  • 如果暂停了一个协程,则堆栈框架仍保留在堆栈上(因为zhr堆栈是协程专有的/拥有的)
  • 将堆栈指针简单地更改为另一个堆栈(==切换到另一个堆栈式协程/光纤)
  • 由于堆栈框架仍保留在堆栈上,因此称为“暂停”
相关问题