Я создаю многопоточную программу, которая активно использует boost::fibers
, когда дело доходит до фактического выполнения тяжелого кода.
Чего я хочу достичь:
Мой основной поток знает, когда активировать и запускать какое волокно, а когда собирать будущее, предоставленное после выполнения оптоволокна.
Поскольку мое программное обеспечение работает в высокопараллельной среде с более чем 100 ядрами, я запускаю как можно больше рабочих потоков. Рабочие потоки должны запускать планировщик оптоволокна, например boost::fibers::algo::work_stealing
. Поэтому они должны выполнять все волокна, которые производит моя основная нить.
В чем проблема:
Поскольку мой основной поток достаточно хорош для создания и синхронизации всех волокон для более чем 100 рабочих потоков, я хочу, чтобы основной поток не присоединялся к выполнению каких-либо волокон.
Это означает, что моя основная нить должна заботиться только о том, чтобы начинать волокна и собирать их фьючерсы после их завершения.
Однако я не знаю, как исключить и мое основное волокно из выполняемых волокон.
Возможные, наивные, решения:
Несмотря на то, что я не знаю, как правильно решить мою проблему, я думаю о нескольких возможностях.
- Создание собственного оптоволоконного планировщика. Планировщик - это точка настройки
boost::fibers
. Следовательно, может существовать возможность записи обычного планировщика, который исключает основной шаг из исполнения.
- Используйте
boost::fibers::buffered_channel
для передачи задач между потоками. Однако я не знаю, если это хорошее решение, так как это исключает большие возможности использования планировщика волокна.
- Отличный способ, я еще не знаю: я думаю, что может быть другой, простой способ исключения основного потока, который создает волокна, от участия в планировании выполнения
boost::fibers
Поскольку я довольно новичок в библиотеке boost::fibers
, мне интересно, как лучше всего достичь своей цели?
С уважением и благодарностью за помощь!