C ++ мастер / работник

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

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

Must support a configurable number of concurrent tasks. Must support dependencies between tasks, such that tasks are not executed until all tasks that they depend on have completed. Must allow for cancellation of tasks (or at least not prevent me from coding cancellation into my own tasks). Must allow for reporting of status and progress information back to the main application thread. Must work on Windows, Mac OS X, and Linux Must be open source.

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

Integrated with Qt's signal/slot mechanism. Supported the use of threads or processes for executing tasks.

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

Спасибо!

 Jason Voegele30 июн. 2009 г., 14:49
Посмотрев ACE и многопоточные блоки Intel, я решил, что TBB наиболее точно соответствует моим требованиям. Спасибо всем, кто нашел время, чтобы ответить.

Ответы на вопрос(6)

Решение Вопроса

Разбираем строительные блоки, который в значительной степени делает то, что вы хотите.

 rlbond30 июн. 2009 г., 03:58
Это работает на AMD, если ты это имеешь в виду.
 Jason Voegele30 июн. 2009 г., 01:17
Я предполагаю, что библиотека Intel TBB работает только на архитектуре Intel, верно? Это может быть хорошо, хотя мне, возможно, придется придумать какую-то схему для постепенной деградации на платформах не-Intel.

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

 Jason Voegele30 июн. 2009 г., 00:42
Я помню, что смотрел на ACEпут день назад. Я на самом деле смотрел на реализацию TAO CORBA, так что вы знаете, что это должно быть давно. ;-) В любом случае, ACE может быть вариантом, но мне нужно прочитать об API, которые он предоставляет, чтобы увидеть, соответствует ли он моим потребностям. Благодарность
 Chris K30 июн. 2009 г., 01:03
ACE только поправился за эти годы. Я чувствую, что они не настолько агрессивны, как могли бы быть - ребята из группы поддержки набирают некоторую слабость в этом отношении. Но когда дело доходит до абстракций операционной системы и распределения событий, ACE находится там, где она есть.

система разделения времени".

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

 shoosh30 июн. 2009 г., 00:53
«Разделение времени» - здесь неуместный термин, поскольку он может относиться к любой ОС, которая может выполнять многозадачность.

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

 Jason Voegele30 июн. 2009 г., 00:41
Да, я думаю, что BOINC, вероятно, будет излишним для моего приложения, которое является просто маленьким риппером CD. Я отредактировал свой оригинальный вопрос, чтобы указать, что это за приложение. Спасибо хоть
 shoosh30 июн. 2009 г., 02:31
HAHA! думаешь? :)

ия в C ++:

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

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

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

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

 Jason Voegele30 июн. 2009 г., 00:46
Спасибо, Зак, но я ищу что-то не настолько низкое, как управление потоками самостоятельно. Я уже наполовину написал свою собственную библиотеку master / worker с использованием потоков Qt, но я предпочел бы использовать что-то проверенное, чем создавать свое собственное недоделанное решение. Потоки Qt и Boost обеспечивают параллельное выполнение, но на самом деле они не соответствуют другим требованиям, которые я изложил в своем первоначальном вопросе.

Ваш ответ на вопрос