LINUX.ORG.RU

История изменений

Исправление alysnix, (текущая версия) :

Суть в том что ты выделяешь кусочки памяти в декодере копируешь туда данные и отправляешь в очередь (массив) а енкодер по мере поступления от туда эти кусочки берёт и делает что-то с ними.

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

схема называется поставщики/получатели.

если «ящики»(блоки данных) большие - они не копируются, а в очередь кладется указатель на блок.

для пущей скоросоти заранее берется X буферов(ящиков) и делаются две очереди. одна - «полных ящиков» передаваемых потребителям, и вторая - пустых ящиков - возвращаемых от потребителей к поставщикам.

поставщик:

  • берет из очереди пустых ящиков пустой(становится его монопольным владельцем, ибо только у него есть на него указатель), заполняет его данными и кладет в очередь «полных ящиков».

потребитель делает все наоборот:

  • берет из очереди полных ящиков полный (то есть указатель на блок данных), делает что надо с ним, и кладет указатель в очередь пустых ящиков.

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

мьютекс внутри очереди лочится только в момент заталкивания или выборки обьекта из нее. поскольку коллизия может быть только в этом месте.

ps

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

то есть, если ты читаешь из очереди и она пуста - поток засыпает, это блокирующая операция.

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

Исходная версия alysnix, :

Суть в том что ты выделяешь кусочки памяти в декодере копируешь туда данные и отправляешь в очередь (массив) а енкодер по мере поступления от туда эти кусочки берёт и делает что-то с ними.

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

схема называется поставщики/получатели.

если «ящики»(блоки данных) большие - они не копируются, а в очередь кладется указатель на блок.

для пущей скоросоти заранее берется X буферов(ящиков) и делаются две очереди. одна - «полных ящиков» передаваемых потребителям, и вторая - пустых ящиков - возвращаемых от потребителей к поставщикам.

поставщик:

  • берет из очереди пустых ящиков пустой(становится его монопольным владельцем, ибо только у него есть на него указатель), заполняет его данными и кладет в очередь «полных ящиков».

потребитель делает все наоборот:

  • берет из очереди полных ящиков полный (то есть указатель на блок данных), делает что надо с ним, и кладет указатель в очередь пустых ящиков.

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

мьютекс внутри очереди лочится только в момент заталкивания или выборки обьекта из нее. поскольку коллизия может быть только в этом месте.