gpt4 book ai didi

c++ - 纤维可以在线程之间迁移吗?

转载 作者:可可西里 更新时间:2023-11-01 10:14:35 24 4
gpt4 key购买 nike

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

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

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

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

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

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

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

最佳答案

提到的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 纤程)。

关于c++ - 纤维可以在线程之间迁移吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45023786/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com