- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在线程 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/
是否可以创建 2 个永远相互调用的 Ruby 纤程? Ruby 最终会因堆栈溢出而崩溃,还是 Fibers 不会占用堆栈空间? 最佳答案 如果你用任何编程语言写一个无限循环,某些东西最终会崩溃。我不熟
我使用 ruby1.9.2p180(2011-02-18 修订版 30909)i686-linux。 Fiber#alive? 返回未定义的错误: fiber = Fiber.new{puts '
您好,我正在尝试使用光纤来等待请求,但它给出了错误 “错误:没有光纤就无法等待” 我应该做什么来处理这个问题。顺便说一下,我不使用meteor,只是纯粹的nodejs。 const Fiber = r
我试图理解以下代码片段的行为。我特别关注 Fiber#transfer方法。 require 'fiber' fiber2 = nil fiber1 = Fiber.new do puts "In
futures 如何处理具有多个参数的回调?这对我对 future 的几乎所有用途都至关重要。 github 示例显示它只处理一个参数。 例子来自 Github Readme是 var fileNam
在下面的代码中,光纤按预期工作(“1”和“2”相隔 2 秒打印)。但是,我想从 fiberFunction 返回“3”并同步打印。但这不起作用。这是输出: 1 Temp: undefined 2 有人
我一直在尝试弄清楚如何使用 node-fibers 使我的数据库代码在 node.js 中不那么困惑,但我无法让它工作。我将代码归结为最小测试用例: var Future = require('fib
所以我习惯这样设置助手: useHelper(sLightRef, THREE.SpotLightHelper); return 这将在 SpotLight 对象上创建一个助手。 我不明白的是如何在
前段时间我偶然发现了 node.js 并且非常喜欢它。但很快我发现它严重缺乏执行 CPU 密集型任务的能力。所以,我开始使用谷歌搜索并得到了这些解决问题的答案:Fibers、Webworkers 和
尝试部署新创建的 Meteor (0.9) 应用程序时,我总是在 Modulus 日志中收到此错误消息: module.js:340 throw err; ^ Error: Cannot
我目前陷入了一个关于 ref 对象类型的 typescript 错误(据我所知)。我对 typescript 很陌生,所以我不知道如何解决这个问题! 我已经附加了 tootip typescript
我正在阅读有关并发的内容。我对那些具有令人困惑的相似定义的术语感到有些困惑。即: 流程 话题 “绿色线程” 原型(prototype)线程 纤维 协程 Go 语言中的“Goroutines” 我的印象
我是一名优秀的程序员,十分优秀!