c++ - 从执行 boost::fibers 中排除一个线程
问题描述
我正在创建一个多线程程序,boost::fibers
它在执行实际执行繁重的代码时高度依赖。
我想要达到的目标:
我的主线程知道何时激活和运行哪个纤程以及何时收集纤程执行后提供的未来。由于我的软件在具有 100 多个内核的高度并行环境中运行,因此我会尽可能多地启动工作线程。工作线程应该运行一个纤程调度器,例如boost::fibers::algo::work_stealing
. 因此他们应该执行我的主线程产生的所有纤维。
有什么问题:
由于我的主线程非常忙于为 100 多个工作线程创建和计时所有纤程,因此我想避免主线程加入任何纤程的执行。这意味着,我的主线程应该只关心启动纤程并在它们完成执行后收集它们的未来。 但是,我也不知道如何将我的主要光纤排除在执行光纤之外。
可能的、幼稚的解决方案: 尽管我不知道如何正确解决我的问题,但我想了一些可能性。
- 创建我自己的光纤调度器:调度器是
boost::fibers
. 因此,可能会编写一个自定义调度程序,该调度程序将主线程排除在执行之外。 - 使用 a
boost::fibers::buffered_channel
在线程之间传输任务:但是,如果这是一个好的解决方案,我不这样做,因为这消除了使用光纤调度程序的巨大可能性。 - 其他我还不知道的好方法:我想可能有另一种简单的方法来排除创建纤维的主线程,参与执行调度
boost::fibers
由于我是boost::fibers
图书馆的新手,我想知道实现目标的最佳方法是什么?
问候并感谢您的帮助!
解决方案
推荐阅读
- python - Python_计算期初和期末贷款余额
- html - 手机屏幕上的水平滚动条
- node.js - 在 gitlab CI 中让 Nodejs 脚本在后台运行
- windows - KMDF:处理 IRQ
- firebase - 将像 instagram 这样的 rdms 转换为 firebase nosql
- javascript - React/Redux - 你什么时候应该从 API 获取新数据来更新你的商店?
- broker - 在 ArtemisMQ 中在队列上设置过滤器时出错
- swift - 调用 SKIndexClose 后 SKIndex 仍然打开
- selenium - 如何在 selenium2library 中找到 send_keys
- html - 如何使 bg-header-top 在移动设备上可见?