光纤可以在线程之间迁移吗?

时间:2017-07-11 01:03:46

标签: c++ linux windows multithreading fiber

线程A中创建的光纤是否可以切换到线程B中创建的另一条光纤?为了使问题更具体,一些操作系统具有原生实现的光纤(windows fibers),
其他需要自己实现它(在linux等中使用setjump longjump)。

例如,

Libcoro将这一切包装在一个API中(对于Windows来说,它只是原生光纤的包装器,对于Linux,它实现了它本身等等。)

那么,如果可以在线程之间迁移光纤,你能用c / c ++给我一个windows(linux)中的示例用法吗?

我在boost库documentation中发现了一些关于光纤迁移的内容,但它对于它的实现和平台依赖性还不够具体。我仍然想要了解如何使用Windows光纤(或在Linux上使用Libcoro)自己完成。

如果不能以一般方式,为什么会这样?

据我所知,光纤用于lightweight threads用于单个线程的协作式多任务处理,与常规线程相比,它们具有廉价的上下文切换,并且它们简化了编程。 一个示例用法是具有多个线程的系统,每个线程都有几个光纤在其父线程上执行某种工作层次结构(从不离开父线程)。

即使它不是预期的用途,我仍然想学习如何以一般的方式做到这一点,因为我认为我可以通过在线程之间迁移光纤来优化作业系统的工作量。

1 个答案:

答案 0 :(得分:2)

上面提到的boost.fiber使用boost.context(callcc / continuation)来实现上下文切换。 直到boost-1.64 callcc仅在汇编程序中实现,boost-1.65使您可以在汇编程序,Windows Fibers(Windows)或ucontext(POSIX(如果可用); POSIX弃用的API)之间进行选择。 汇编器实现比其他两个更快(与ucontext相比,2个数量级)。

boost.fiber使用callcc来实现轻量级线程/光纤 - 该库提供了光纤调度程序,允许在线程之间迁移光纤。 例如,一个提供的调度程序在其运行队列失效时(从准备好/可以恢复的光纤)中窃取来自其他线程的光纤。

(因此您可以选择在线程之间迁移的Windows Fibers)。