线程A中创build的光纤是否可以切换到线程B中创build的另一条光纤? 为了使问题更具体,一些操作系统具有本地实现的光纤 ( windows光纤 ),
其他需要自己实现它(在Linux中使用setjump longjump等)。
例如, Libcoro将其全部包装在一个API中(对于Windows而言,它仅仅是一个本地光纤的包装,对于Linux来说,它本身就实现了它)
所以,如果可以在线程之间迁移光纤,可以给我一个在c / c ++中的windows(linux)的例子吗?
我在boost库文档中发现了一些关于光纤迁移的内容 ,但是关于它的实现和平台依赖性还不够具体。 我仍然想知道如何自己做,只使用Windows光纤(或在Linux上使用Libcoro)。
如果这是不可能的,为什么呢?
我明白,光纤意味着用作轻量级线程,用于在单个 线程上进行协作式多任务处理,与常规线程相比,它们具有便宜的上下文切换,并且简化了编程。 一个示例用法是一个包含多个线程的系统,每个线程都有几个在其父线程上执行某种工作层级的线程(永远不会离开父线程)。
即使这不是预期的用途,我仍然想学习如何以通用的方式来做到这一点,因为我认为我可以通过在线程之间迁移光纤来优化工作系统上的工作负载。
提到的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 Fibre)。