问题标签 [boost-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 回答
274 浏览

c++ - 在 Linux for Windows 上交叉编译 boost Fiber 库

我正在按照以下方式构建boost库:

我的 ~/user-config.jam 是:

使用这些标志开始构建过程:

这可以很好地构建大多数库,但是没有构建纤程库。相关输出:

0 投票
0 回答
55 浏览

c++ - 调试语句的 C++ 预处理器

我一直在浏览一些 Boost-Fiber 示例和 Nat Goodspeed 提供的 Boost-Fiber 优先级调度程序。在他的代码中,他在调试代码之前的行上使用字符序列 //<-,在下一行使用 //->。

我想知道是否有某种 C++ 预处理器可以删除此代码,或者根据调试模式将其保留。

我想使用他的调度程序,没有调试代码,但如果已经存在某些东西,我不想手动删除它。

谢谢。

0 投票
0 回答
117 浏览

c++ - 从执行 boost::fibers 中排除一个线程

我正在创建一个多线程程序,boost::fibers它在执行实际执行繁重的代码时高度依赖。

我想要达到的目标:

我的主线程知道何时激活和运行哪个纤程以及何时收集纤程执行后提供的未来。由于我的软件在具有 100 多个内核的高度并行环境中运行,因此我会尽可能多地启动工作线程。工作线程应该运行一个纤程调度器,例如boost::fibers::algo::work_stealing. 因此他们应该执行我的主线程产生的所有纤维。

有什么问题:

由于我的主线程非常忙于为 100 多个工作线程创建和计时所有纤程,因此我想避免主线程加入任何纤程的执行。这意味着,我的主线程应该只关心启动纤程并在它们完成执行后收集它们的未来。 但是,我也不知道如何将我的主要光纤排除在执行光纤之外。

可能的、幼稚的解决方案: 尽管我不知道如何正确解决我的问题,但我想了一些可能性。

  1. 创建我自己的光纤调度器:调度器是boost::fibers. 因此,可能会编写一个自定义调度程序,该调度程序将主线程排除在执行之外。
  2. 使用 aboost::fibers::buffered_channel在线程之间传输任务:但是,如果这是一个好的解决方案,我不这样做,因为这消除了使用光纤调度程序的巨大可能性。
  3. 其他我还不知道的好方法:我想可能有另一种简单的方法来排除创建纤维的主线程,参与执行调度boost::fibers

由于我是boost::fibers图书馆的新手,我想知道实现目标的最佳方法是什么?

问候并感谢您的帮助!

0 投票
0 回答
69 浏览

c++11 - 由工作线程托管的 Boost.Fibers 似乎不起作用——为什么?

我想使用由工作线程托管的 Boost.Fibers 而不仅仅是线程。我想在编写下面显示的代码时,我已经按照手册中的所有内容完成了所有操作,但它似乎不起作用——输出中缺少“<anonymous> called”。

有谁知道为什么?

0 投票
1 回答
225 浏览

c++ - 比较 Boost.Fiber 和 Goroutines 的正确可用性

再会,

好吧,我知道已经有一些关于 Boost.Fiber 和 Goroutines 比较的讨论。但是作为并发领域的新开发人员,我对差异和可用性感到很困惑。

所以目前,我正在做一些 Go 到 C++ 的迁移,我的一些障碍是使用 Channels 和 Goroutines,所以我对并发、Boost.Fiber 和 Goroutines 做了一些小阅读,并根据我的理解做了一个示例实现关于这个话题。

所以上面的代码是一个基本的成功和超时方案,当一个函数在一定时间内没有返回一个状态时,它就会超时。

clientWatchControlChannel实际场景中,这Sleep将是需要返回某些内容并完成该过程的其他进程。基于硬编码值,整个程序返回"Process done, server terminated the session.",因为运行的持续时间clientWatchControlChannel< 中的超时值runDurationTimer

toStop <- timeout因此,当我调试代码时,它会运行 2 个过程,因此我在and处放置了一个断点toStop <- serverDone,因此runDurationTimer运行然后休眠,然后在等待完成时运行clientWatchControlChannel然后首先完成,因为它的持续时间小于runDurationTimer,在此之后,它不会去返回runDurationTimer并等待,它只是终止并为输出分配值。

根据我对 C++ 的理解,我编写了以下代码。

所以长话短说,一切在行为上几乎是一样的。再次,我调试了代码,在toStop.push(serverDone);and中放置了断点toStop.push(timeout);,所以与 Go 相同,它runDurationTimer先运行然后等待它完成clientWatchControlChannel并运行toStop.push(serverDone);,但不同之处在于它不是终止,而是返回runDurationTimer并运行toStop.push(timeout);。所以我认为这是我真正感到困惑的事情。然后chan.pop(i)返回serverDone

所以,我真的需要一些帮助来理解它是否正确,或者我应该继续使用 Boost.Fiber 进行 Go 迁移还是使用 Boost.Coroutines2。感谢任何建议,反应和更正,我愿意从中学习。

我也对我的 C++ 表示歉意,一直停滞不前。:)

谢谢。

0 投票
1 回答
173 浏览

c++ - 使用 boost 光纤实现的单个生产者、多个并行消费者

我正在尝试编写一个生产者、多个消费者管道,其中消费者在并行线程中运行。或者找到或分享一个简单的例子。使用Go 中相对简单的代码,输出清楚地显示了消费者并行工作。我认为它可能与 Boost 1.73 光纤类似,但我无法超越(不出所料)按顺序工作的代码:

我尝试插入许多代码片段的变体来让工作线程调度纤程,但它们总是按顺序执行或根本不执行。来自关于逆问题的问题的代码似乎是朝着正确方向迈出的一步,虽然比 Go 复杂得多,但是(当使用 -DM_1_PI=3.14 编译时)该程序对我来说也只是闲置。

0 投票
1 回答
176 浏览

c++ - 有谁知道为什么我在 macOS 上构建 boost 但没有创建 boost::fiber 库?

我正在编写一些使用 boost::fiber 作为协程的代码。该代码在 Windows 上运行良好,但是当我将它(通过 git)克隆到 macOS 时,我发现 cmake 找不到 boost::fiber。

在 windows 和 macOS 上,我自己构建和安装了 boost ./boostrap.sh --with-libraries=all(sudo) ./b2 install -a除了我还在 Ubuntu 20.04 上构建用于测试,在 linux 和 windows 上,在安装的文件夹中生成了 libfiber.a 或 .so。但在 macOS 上,没有。

我的 macbook air 已经完全重新安装了一周。我认为macOS版本和clang版本应该非常非常接近最新。

我可以知道是否有人去过那里并想出了如何在 macOS 上构建 boost::fiber 吗?

谢谢你。

0 投票
1 回答
133 浏览

c++ - BOOST_ASSERT 失败在 Visual Studio“调试”版本的 boost::fiber 中引发

我遇到了 boost::fiber 的问题。我的代码基于 boost::fiber 的“work_stealing.cpp”示例。我稍微装饰了一下。它现在可以在 Windows 子系统 Linux Ubuntu 上运行,用于调试和发布版本。事实上,直到昨晚它都可以在 Windows Visual Studio 版本上运行......但是今天,我们尝试运行一些测试,在 Debug 版本上引发了 BOOST ASSERT 失败。发布版本可以工作...

我不知道为什么......所以,有人知道这件事吗?为什么它只在 Windows Debug 版本上?我做错了什么?

我使用 cmake 作为构建工具,Visual Studio 2019 社区版作为开发工具。我还在 WSL Ubuntu 20.04 和 macOS 10.15.x 上进行了测试(不记得了……)。

谢谢你。

-全

以下 boost 代码引发的故障:

我的代码如下(我删除了一些不相关的部分......):

[更新] 添加快照以更清楚地说明我的情况...

0 投票
0 回答
35 浏览

c++ - dlclose 不释放库句柄以防访问静态类成员,例如调用 boost::this_fiber::get_id()

我有一个场景如下,无法关闭图书馆

liba.so


我从指定了 -fno-unique-symbol 的 cpp 文件中创建了一个库,这样它就不会保留符号。

主要代码

输出,当 this_fiber 被注释掉时

  • 句柄:0x234567
  • 结束退出代码 0
  • 句柄:0x345678
  • 结束退出代码 0
  • 句柄:0x456789
  • 结束退出代码 0

----- 但是当 this_fiber::get_id() 处于活动状态时

  • 句柄:0x234567
  • 结束退出代码 0
  • 句柄:0x234567
  • 结束退出代码 0
  • 句柄:0x234567
  • 结束退出代码 0

有人可以解释阻止库句柄的原因并告诉我如何调整代码以便我可以关闭库

0 投票
0 回答
61 浏览

c++ - 如何跨线程恢复增强纤维?

我想跨线程恢复增强纤维。不幸的是,我在 boost fiber 文档中找不到任何有用的东西,即使在“在线程之间迁移纤维”段落也是如此。

示例代码:

谢谢。