问题标签 [fiber]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
60 浏览

nic - 如何将特定的数据流输出到 SFP+ NIC 模块?

我想通过连接到我的工作站计算机(可以是 Windows 或 CentOS/Linux)的 NIC 将 1 和 0 的流输出到光纤 SFP+ 模块,我从哪里开始以及如何开始?任何用于此的软件名称?感谢您的任何指示。

0 投票
1 回答
130 浏览

c++ - 分段堆栈可以与其他库一起自由使用吗

我理解它的方式,分段堆栈是在编译器支持下构建的,因此每当在分段堆栈上运行的函数调用另一个函数时,如果首先检查堆栈是否有足够的空间用于该新函数的堆栈帧。如果它没有附加另一个分段堆栈并且代码分支到该函数。

但是,如果说例如我有一个正在运行的光纤并且我从另一个未使用该-fsplit-stack选项编译的共享(或编译为非共享对象文件)库中调用另一个函数,这是否有效?该库中的函数如何知道它们必须检查分段堆栈中是否有足够的空间才能继续?

只对 clang 和 gcc 实现感兴趣(尤其是 boost 上下文),谢谢!

0 投票
1 回答
1264 浏览

c++ - 如何在 boost.fibers 中使用 work_stealing 调度程序

我正在尝试构建一个通用任务系统,我可以在其中发布在任何空闲线程上执行的任务。在之前的尝试中,我经常用完线程,因为它们会在某个时候阻塞。所以我正在尝试增强纤维;当一根光纤阻塞时,线程可以自由地在其他光纤上工作,听起来很完美。

工作窃取算法似乎非常适合我的目的,但我很难使用它。在示例代码中,创建了纤程,然后才创建线程和调度程序,因此所有纤程实际上都在所有线程上执行。但是我想稍后启动纤程,然后所有其他线程都被无限期地挂起,因为它们没有任何工作。我还没有找到任何方法来再次唤醒它们,我所有的纤维都只在主线程上执行。“通知”似乎是要调用的方法,但我看不到任何实际获取算法实例的方法。

我尝试保留指向算法所有实例的指针,以便调用 notify(),但这并没有真正帮助;大多数时候,工作线程中的算法不能从主线程中窃取任何东西,因为下一个是 dispatcher_context。

我可以禁用“挂起”,但线程正忙于等待,而不是一个选项。

我还尝试了 shared_work 算法。同样的问题,一旦线程找不到纤程,它就永远不会再次唤醒。我尝试了手动调用 notify() 的相同技巧,结果相同,非常不可靠。

我尝试使用通道,但是 AFAICT,如果光纤正在等待它,则当前上下文只是“跳跃”并运行等待的光纤,暂停当前的光纤。

简而言之:我发现在另一个线程上可靠地运行光纤非常困难。在分析时,大多数线程只是在等待一个 condition_variable,即使我确实创建了大量的纤维。

作为一个小测试用例,我正在尝试:

我故意使用 this_thread::sleep_for 来模拟 CPU 繁忙。

对于 16 个线程,我希望这段代码能在 1 秒内运行,但大多数情况下它最终会是 16 秒。我能够让这个特定的示例在 1 秒内实际运行,只是在周围乱搞;但没有办法感觉“正确”,也没有办法适用于其他场景,它总是必须针对一个特定场景手工制作。

我认为这个例子应该可以像预期的那样使用 work_stealing 算法;我错过了什么?仅仅是滥用纤维吗?我怎样才能可靠地实现这一点?

谢谢,迪克斯

0 投票
1 回答
584 浏览

c++ - c ++ boost:fiber - 我如何中断光纤或加入等待最长时间?

如何使用 c++ boost 停止(中断)光纤?

例如

如何使用 c+ boost 执行光纤连接(时间)(默认 api 不接受最大等待时间)?例如:

fiber.join(1000);

是否可以暂停光纤,在磁盘上对其进行序列化,然后将其重新加载到系统中?

0 投票
1 回答
144 浏览

java - 为什么在 JNI 中调用 Fiber 会在 JVM 中引发 StackOverflow?

我认为这在这里也是一个难题。反正我想试试。

我实现了一个小型项目 JNI,它在 Java 中移植了本地 boost 光纤。

这是JNI接口

这是java测试

如果我执行此代码

如果我删除了 fiber.join() 并添加了 fiber.detach();

0 投票
1 回答
156 浏览

java - Quasar Fiber - join() 和 get() 之间的区别

标题说明了一切。这两种方法没有明确说明应该使用哪种方法。

0 投票
2 回答
788 浏览

c++ - Boost.Fiber 是否自动屈服于网络请求,例如网络上的数据库调用?

Boost.Fiber 是否会在网络请求上自动产生(如果我理解正确的话,它们会在 I/O 期间产生 CPU),例如通过网络调用数据库?我想用它来设置阻塞数据库调用,我要插入大量信息并且有很多小记录需要在收到时插入。我的另一个选择是用于微线程的 libdill/libmill。

一般的想法是:

  1. 接收数据
  2. 创建光纤并将数据传递给它
  3. Fiber 获取数据库连接并发送 INSERT 查询(带有 postgres 的 libpqxx)
  4. 其他纤程运行并可在数据库查询运行时访问数据库
  5. 从数据库查询返回,进行错误处理和处理响应

纤维是否按照我的设想以这种方式工作?

这是使用 RapidJSON 和 boost.fiber 的代码的简化基本结构,但我从网络(websocket)获取消息:

0 投票
1 回答
87 浏览

mongodb - ['Parse error: Can\'t wait without a fiber']' 尝试在 Metor 中查找时

通过 websockets 接收 JSON 数据时,我试图将这些数据输入到流星中的 mongodb 中。我得到的 JSON 数据很好,但是当试图查找数据库中是否已经存在数据时,我不断收到错误消息:“['Parse error: Can\'t wait without a fiber']'。

谁能指出我正确的方向来解决这个问题?

非常感谢,鲁弗斯

0 投票
1 回答
925 浏览

c++ - 使用 Boost.Fibers 的生产者/消费者

我正在尝试使用 Boost.Fibers 创建生产者/消费者。看起来channels从这个例子中使用是正确的做法。该示例必须稍作更改,因为我想使用promise/future. 所以我写了一些幼稚的代码不做任何工作,只是发出完成的信号。

但是,它不会编译,它会抱怨promise正在访问已删除的复制构造函数。首先,我不知道复制构造函数在哪里(以及为什么)被调用。其次,我不确定这是boost::fibers应该使用的方式。
用途

错误信息

在 /usr/include/c++/7/future:48:0、/home/user/Downloads/boost_1_66_0/boost/fiber/exceptions.hpp:12、/home/user/Downloads/boost_1_66_0/boost 包含的文件中/fiber/future/future.hpp:17,来自 /home/user/Development/Tests/shared_state_test/main.cpp:4:/usr/include/c++/7/bits/std_function.h:在 'static void 的实例化中std::_Function_base::_Base_manager<_Functor>::_M_clone(std::_Any_data&, const std::_Any_data&, std::false_type) [with _Functor = fiber_worker::submit()::; std::false_type = std::integral_constant]': /usr/include/c++/7/bits/std_function.h:227:16: 来自'static bool std::_Function_base::_Base_manager<_Functor>::_M_manager( std::_Any_data&, 常量 std::_Any_data&, std:: _Manager_operation) [with _Functor = fiber_worker::submit()::]' /usr/include/c++/7/bits/std_function.h:695:19: 来自 'std::function<_Res(_ArgTypes ...) >::function(_Functor) [with _Functor = fiber_worker::submit()::; =无效;=无效;_Res = 无效;_ArgTypes = {}]' /home/user/Development/Tests/shared_state_test/main.cpp:45:66:
此处需要/usr/include/c++/7/bits/std_function.h:192:6:错误:使用已删除的函数'fiber_worker::submit()::::(const fiber_worker::submit()::& )' 新 _Functor( __source._M_access<_Functor>()); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /home/user /Development/Tests/shared_state_test/main.cpp:45:36: 注意:'fiber_worker::submit()::::(const fiber_worker::submit()::&)' 被隐式删除,因为默认定义是格式错误:ch.push(p{std::move(prom)} mutable { p.set_value(); }); ^ /home/user/Development/Tests/shared_state_test/main.cpp:45:36:错误:使用已删除的函数 'boost::fibers::promise::promise(const boost::fibers::promise&)' 在文件中包含在 /home/user/Development/Tests/shared_state_test/main.cpp:5:0: /home/user/Downloads/boost_1_66_0/boost/fiber/future/promise.hpp:192:5: 注意:此处声明 promise(承诺 const&) = 删除;^~~~~~~

EDIT001:看起来频道无法使用移动 lambda

将联系 boost::fibers 维护人员进行澄清

EDIT002:这里boost::fibers::buffered_channel唯一的问题与我的阿尔茨海默症没有问题,我(再次)忘记了std::function必须是可复制的,并且当 lambda 捕获仅可移动类型std::function创建将在复制时失败

0 投票
2 回答
5497 浏览

c++ - 光纤用例

我正在阅读很多有关Fibersgreen threads或任何其他我们可以给用户线程线程的名称。我开始阅读文档和教程(这些是 C++ 链接,但我不需要特定的语言):

但是,我似乎无法掌握有关纤维的要领。我知道 Fiber 是一种协作多任务的方式,但据我发现,在实际情况下有关线程和 Fiber 之间相互作用的文档很少。

光纤有哪些实际用例?

例如,每个文档实际上都使用异步 I/O 作为示例,但是如果我没有 I/O 绑定问题怎么办?例如,如果我的问题是计算一个大文件中的单词怎么办?在这里,我只是在线程之间拆分文件,纤维可以以某种方式提供帮助吗?我认为诸如数值问题(例如矩阵/向量运算)之类的受 CPU 限制的计算不适用于光纤,但同样,我可能完全错了。