2

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

例如, Libcoro将所有这些都包装在一个 API 中(对于 Windows,它只是原生光纤的包装器,对于 Linux,它自己实现它等等)

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

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

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

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

即使这不是预期用途,我仍然想学习如何以一般方式进行操作,因为我认为我可以通过在线程之间迁移纤程来优化工作系统上的工作负载。

4

1 回答 1

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 光纤)。

于 2017-07-11T06:40:04.253 回答