协程、Coroutine2和Fiber有什么区别?

15

Coroutine已被弃用,建议使用Coroutine2。除此之外,这基本上是线程和协程之间的区别。 - Cory Kramer
1
@CoryKramer 纤程不是线程。所以,是在那个范畴内,但更多的是多面向的。 - sehe
2
@DavidHaim 作为一个旁注,我真的很难过他们选择了 co_ 前缀。 - Borgleader
1
@DavidHaim Stackless可以解决某些特定的问题,但效率更高。Stackfull让你做更疯狂的事情;我在大学里花了一个学期玩弄stackful,并且它确实有很多优势。也许不值得代价,而且我没有尝试使用stackless重新实现我的工作。但我的观点是它们是完全不同的东西,只是名字相同。 - Yakk - Adam Nevraumont
1
@David Haim,如果您想从深度调用堆栈中使用可恢复函数获得收益,则调用堆栈中的所有函数也必须是可恢复函数(如果在调用堆栈中调用第三方库函数会怎样)。请注意,每个可恢复函数都需要内存来存储本地变量、寄存器、函数状态 - 内存是动态分配的(性能如何?)。此外 - 可恢复函数受益于编译器支持,boost实现仅限于库。我还没有看到使用可恢复函数提供类似boost.coroutine2或boost.fiber的API的等效库。 - xlrg
显示剩余4条评论
1个回答

44

boost.coroutine 是非C++11标准的,因此需要使用boost.context的私有API(原因是它已被弃用)。

boost.coroutine2boost.fiber 需要C++11,并使用boost.context中的 callcc()/continuation(实现上下文切换、带当前续体调用)。

boost.coroutineboost.coroutine2 实现了协程,而 boost.fiber 提供了轻量级、协作式用户空间线程(即 green-threads),其 API 类似于 std::thread。

协程和纤程的区别在于 N4024: Distinguishing coroutines and fibers 中有描述,简单来说:纤程由 内部调度器 切换,而协程则使用 无内部调度器


我强烈推荐阅读链接的 N4024!附注:据我所知,Python 的 asyncio 基本上就是这样做的:使用 Python 生成器(协程)提供调度程序和一些纤维,以进行异步 I/O :) - Marti Nito

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