纤维,协程和绿线之间有区别吗?


57

今天,我在互联网上阅读了几篇有关纤维,协程和绿色线程的文章,看来这些概念有很多共通之处,但还是存在细微的差异,尤其是当我们谈论纤维和协程时。

是否有一个简洁,正确的摘要来使它们彼此不同?

更新:我发现区分协程和纤维(N4024 C ++草案)文档特别擅长区分纤维和协程。

Answers:


106

一个光纤是使用合作多任务,而不是抢占式多任务的轻量级线程。运行中的光纤必须明确地“屈服”以允许另一根光纤运行,这使其实现比内核或用户线程容易得多。

协程是概括的子程序,以允许悬浮和在某些位置恢复执行多个入口点的成分。与子例程不同,协程可以通过调用其他协程来退出,这些协程以后可能会返回到它们在原始协程中被调用的位置。

绿色线程是由虚拟机(VM),而不是本地调度由底层操作系统的线程。绿色线程在不依赖任何本机OS功能的情况下模拟多线程环境,并且它们在用户空间而不是内核空间中进行管理,从而使它们可以在不具有本机线程支持的环境中工作。


13
我只能为自己说-这个答案对我来说非常有价值。我对此与罗伯特有共同意见。
DejanLekic 2014年

“主题广泛的摘要是Wikipedia的专业,它专注于并优化了提供这些内容并培养了面向其的文化。愿意,最有能力和有经验的人在提供此类摘要时去Wikipedia,而不是去Stack Exchange ...在搜索引擎中寻找此内容的人通常会看到两个直接竞争的内容示例,一个在SE网络中,另一个在Wikipedia中...由于上述原因,相比之下,SE内容最有可能显得劣等... “
咬到

请注意,协程和纤维可能被认为是密切相关的,甚至可能是同一件事。如果需要协程,则可以通过光纤轻松实现它们,反之亦然。
cHao 2014年

9
没有说明它们有何不同。所有这些定义似乎都相当。
哈森

1
@gstackoverflow:Java线程是OS线程。JVM通过OS调度它们。
罗伯特·哈维
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.