C ++ мастер / работник - PullRequest
5 голосов
/ 30 июня 2009

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

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

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

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

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

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

Спасибо!

Ответы [ 6 ]

3 голосов
/ 30 июня 2009

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

2 голосов
/ 30 июня 2009

Ознакомьтесь с Intel * Thread Building Blocks Библиотека.

2 голосов
/ 30 июня 2009

Я думаю, что это требует от Threading Building Blocks от Intel, который в значительной степени делает то, что вы хотите.

1 голос
/ 30 июня 2009

Звучит так, будто вам нужна какая-то "Система разделения времени".

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

0 голосов
/ 30 июня 2009

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

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

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

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

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

0 голосов
/ 30 июня 2009

Это, вероятно, огромное излишество для того, что вам нужно, но все же стоит упомянуть -
BOINC - распределенная структура для таких задач. Есть главный сервер, который выдает задачи, и облако работников, которые выполняют его назначение. Это основа таких проектов, как SETI @ Home и многих других.

...