我注意到在Boost.Coroutine2 for C++中删除了对对称协程的支持,所以我想了解 - 两者之间有什么区别?
Dan*_*ien 13
AnaLúciadeMoura和Roberto Ierusalimschy在他们的论文" Revisiting Coroutines " 中特别描述了对称和不对称协程之间的区别:
众所周知的协程分类涉及所提供的控制转移操作,并区分对称和非对称协程的概念.对称协程设备提供单一的控制转移操作,允许协同程序明确地在它们之间传递控制.非对称协程机制(更常见地表示为半对称或半协同程序)提供两个控制转移操作:一个用于调用协程,一个用于挂起它,后者将控制权返回给协程调用程序.虽然对称协程在相同的层次级别上运行,但是不对称协程可以被视为从属于其调用者,它们之间的关系有点类似于被调用和调用例程之间的关系.
支持并发编程的协同机制通常提供对称协程来表示独立的执行单元,如Modula-2.另一方面,旨在实现产生值序列的构建体的协同机制通常提供不对称的协同程序.这种类型的构造的示例是迭代器和生成器.
(引文省略)
在非对称协程模型中,"不对称"指的是协程之间存在类似堆栈的调用者 - 被调用者关系的事实.协程可以调用另一个协程或通过对其调用者产生控制来暂停自身,通常还会同时为调用者产生一个值.
在对称的协程模型中,协程可以无限制地控制任何其他协程.
这两个模型实际上具有相同的表现力; 即,不对称协程可以使用对称协程来实现,反之亦然.(参见Giovanni P. Deretta编写的对称协程,用于两种协程之间的转换.)因此,Moura和Ierusalimschy写道:"提供这两种结构只会使[coroutine]机制的语义复杂化,而不会增加表现力."
Coroutine2的开发人员决定不在库中提供对称协同程序,因为他们认为boost::context::execution_context(Boost.Context的一部分)更好地实现了对称协程功能:http://lists.boost.org/Archives/boost/2015/06/ 223701.php
xlr*_*lrg 11
协同程序在被调用方和被调用方之间切换,例如,您输入了corotuine-function,然后切换回调用代码.通常(非对称)协程有两个用于此目的的函数:
因为您有两个函数来切换上下文,所以它被称为非对称.对称协同程序只有一个函数可以暂停当前上下文并恢复另一个上下文.请注意,您必须指定下一个必须恢复的对称协程.
对称协同程序可用于实现用户区域线程(对称协程表示用户空间线程;调度程序从一个到另一个symmtric协程跳转,例如,下一个用户区域线程被调度)比非对称协程更有效.这是显而易见的,因为对称协程不需要跳回调用者以恢复下一个用户域线程.非对称协程需要比对称协程更多的上下文切换才能实现相同的功能.
对称协程 - 对称上下文切换 - 更好地用" 使用当前连续调用 "(Scheme,Ruby ...)等概念来表示.boost.context通过callcc()/ continuation的实现支持这个概念.因此boost.coroutine2不提供对称的协程API - 但boost.coroutine2的不对称协程是用boost.context的callcc()/ continuation实现的.
| 归档时间: |
|
| 查看次数: |
2476 次 |
| 最近记录: |