2015-01-20 5 views
1

я столкнулся с распараллеливанием простого цикла опроса-процессом, который выглядит следующим образом:одного производителя, множественная архитектура потребитель

while(!done) 
    buffer = poll(...) 
    foreach(item i in buffer) 
     process(i) 

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

Учитывая, что реализация должна быть многопоточным кодом на C++, какие структуры данных я должен использовать?

Спасибо за ваш совет!

+2

вы это помечены как безблокировочные. Вы ищете решение без блокировки (знаете ли вы, какие существуют блокирующие решения)? –

+0

да, если возможно. Наличие нескольких потребителей, которые все потребляют все, что есть, привело меня в тупик. Естественно, я бы хотел избежать копирования буферов для потребителей. – NrubDub

+0

, но почему блокировка? –

ответ

0

Si Я думаю, что лучшим вариантом является создание очереди сообщений для каждого потребителя.

Это означает, что все потребители должны зарегистрироваться у производителя, а затем производитель должен поставить в очередь сообщение в каждой очереди сообщений.

Хорошей возможностью реализации является создание прокси-объекта между производителем и потребителем, прокси-объект представляет собой гибридный объект, что означает, что он потребляет все сообщения от производителя, а также передает их всем зарегистрированным потребителям ,

+1

Я думаю, что это может сработать. Буферам может потребоваться подсчет указателей/ссылок или shared_ptr для контроля их продолжительности жизни. –

+0

@MartinJames +1 на ваш комментарий –

1

Если вы знаете количество потребителей заранее, у вас может быть очередь для каждого потребителя.

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

Не забудьте синхронизировать доступ к вектору, так как он может быть перераспределен, когда производитель добавляет элемент

Смежные вопросы