Вопрос

Я ищу кроссплатформенную библиотеку C++ master/worker или библиотеку рабочих очередей.Общая идея заключается в том, что мое приложение будет создавать своего рода объекты Task или Work, передавать их мастеру работы или рабочей очереди, которая, в свою очередь, будет выполнять работу в отдельных потоках или процессах.Чтобы представить немного контекста, приложение представляет собой программу копирования компакт-дисков, а задачи, которые я хочу распараллелить, — это такие вещи, как «копировать дорожку», «кодировать WAV в Mp3» и т. д.

Мои основные требования:

  • Должен поддерживать настраиваемое количество одновременных задач.
  • Должен поддерживать зависимости между задачами, чтобы задачи не выполнялись до тех пор, пока не будут завершены все задачи, от которых они зависят.
  • Должен разрешать отмену задач (или, по крайней мере, не препятствовать тому, чтобы я кодировал отмену в своих собственных задачах).
  • Должен позволять отправлять отчеты о состоянии и ходе выполнения обратно в основной поток приложения.
  • Должен работать в Windows, Mac OS X и Linux.
  • Должен быть с открытым исходным кодом.

Было бы особенно хорошо, если бы эта библиотека также:

  • Интегрирован с механизмом сигналов/слотов Qt.
  • Поддерживается использование потоков или процессы выполнения задач.

По аналогии, я ищу что-то похожее на Java ExecutorService или какую-то другую подобную библиотеку пула потоков, но на кроссплатформенном C++.Кто-нибудь знает такого зверя?

Спасибо!

Это было полезно?

Решение

Я думаю, это требует информации Потоковые строительные блоки, который в значительной степени делает то, что вы хотите.

Другие советы

Я не пользовался им достаточно долго и не уверен, точно ли он соответствует вашим потребностям, но ознакомьтесь с Адаптивная коммуникационная среда (ACE).Эта библиотека позволяет создавать «активные объекты», которые имеют рабочие очереди и выполняют свое основное тело в своих собственных потоках, а также пулы потоков, которые можно использовать совместно с объектами.Затем вы можете передать рабочие объекты очереди активным объектам для их обработки.Объекты можно объединять различными способами.Библиотека довольно большая, и в ней есть чему поучиться, но о ней написано несколько книг, а также в Интернете доступно достаточное количество обучающей информации.Он должен быть в состоянии делать все, что вы хотите, и даже больше, меня беспокоит только то, обладает ли он интерфейсами, которые вы ищете, «из коробки», или вам придется строить на его основе, чтобы получить именно то, что вы ищете. для.

Посмотрите Интелс Строительные блоки резьбы библиотека.

Похоже, вам нужна какая-то «система разделения времени».

Есть несколько хороших программ с открытым исходным кодом, но я не знаю.
если у них есть встроенная поддержка слота QT.

Вероятно, это слишком много для того, что вам нужно, но все же стоит упомянуть:
БОИНК представляет собой распределенную среду для таких задач.Есть главный сервер, который выдает задания для выполнения, и облако воркеров, которые выполняют его приказы.Это основа таких проектов, как SETI@Home и многих других.

См. этот пост для создания потоков с использованием библиотеки boost на C++:

Простой пример многопоточности в C++

(это поток C++, хотя в заголовке написано c)

по сути, создайте свой собственный «главный» объект, который принимает «работающий» объект и запускает его в новом потоке.

Затем вы можете создать новые классы, реализующие «runnable», и передать их своему мастеру-раннеру в любой момент, когда захотите.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top