Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: Serr500 от Август 24, 2011, 14:36



Название: [Решено] Кольцевой буфер с несколькими потребителями
Отправлено: Serr500 от Август 24, 2011, 14:36
Возникла интересная задачка. Не могу никак сообразить как её решить наиболее оптимальным путём. То ли туплю, то ли знаний не хватает...  ???

Итак, есть кольцевой буфер (Circular Buffer), поток-производитель (Producer Thread) и потоки-потребители (Consumer Threads). Производитель заполняет ячейки буфера, потребители их считывают. Ячейка буфера должна быть доступна для производителя не раньше чем ВСЕ потребители считают из неё данные. Алгоритм работы обычного кольцевого буфера (один производитель, один потребитель) не подходит, поскольку в нём после прочтения уже одним потребителем объект синхронизации разрешит производителю перезапись блока.

Ситуация осложняется ещё тем, что число потребителей может меняться в процессе выполнения. Впрочем, по условиям задачи их число не может возрастать, что несколько упрощает дело. Однако, на это пока можно не обращать внимания, для начала можно решить задачу и с неизменным числом потребителей

Каким образом можно реализовать такой буфер? Какие объекты синхронизации использовать в данном случае? Буду очень благодарен за любую помощь. Заранее спасибо.


Название: Re: Кольцевой буфер с несколькими потребителями
Отправлено: Igors от Август 24, 2011, 18:25
Долго объяснять, проще написать (аттач). Выводить из игры "потребителя" можно просто поставив ему stopFlag (не нужно удалять его из вектора, себе дороже)


Название: Re: Кольцевой буфер с несколькими потребителями
Отправлено: Serr500 от Август 25, 2011, 16:09
Спасибо. Буду разбираться.


Название: Re: Кольцевой буфер с несколькими потребителями
Отправлено: Serr500 от Ноябрь 07, 2011, 17:13
Нашёл в сети уже готовый класс, который почти без изменений подошёл к моей задаче. Может, кому-то пригодится. http://tver-soft.ru/index.php/articles/5-ring-buffer (http://www.tver-soft.ru/index.php/articles/5-ring-buffer)


Название: Re: Кольцевой буфер с несколькими потребителями
Отправлено: Igors от Ноябрь 07, 2011, 18:49
Нашёл в сети уже готовый класс, который почти без изменений подошёл к моей задаче. Может, кому-то пригодится. http://tver-soft.ru/index.php/articles/5-ring-buffer (http://www.tver-soft.ru/index.php/articles/5-ring-buffer)
Сравнивая даты постов - время с августа по ноябрь было посвящено поискам?  :)


Название: Re: Кольцевой буфер с несколькими потребителями
Отправлено: Serr500 от Август 22, 2012, 11:12
Сайт автора переехал на другой адрес. Теперь статья здесь: http://tver-soft.org/ru/articles/cpp/14-ring-buffer (http://tver-soft.org/ru/articles/cpp/14-ring-buffer).