История изменений
Исправление alysnix, (текущая версия) :
Суть в том что ты выделяешь кусочки памяти в декодере копируешь туда данные и отправляешь в очередь (массив) а енкодер по мере поступления от туда эти кусочки берёт и делает что-то с ними.
межтредовая очередь это полный аналог ленточного транспортера… N рабочих ставят свой ящик на транспортер и бегут за новым , и M рабочих берут ящики с транспортера и ставят например их на полки на складе.
схема называется поставщики/получатели.
если «ящики»(блоки данных) большие - они не копируются, а в очередь кладется указатель на блок.
для пущей скоросоти заранее берется X буферов(ящиков) и делаются две очереди. одна - «полных ящиков» передаваемых потребителям, и вторая - пустых ящиков - возвращаемых от потребителей к поставщикам.
поставщик:
- берет из очереди пустых ящиков пустой(становится его монопольным владельцем, ибо только у него есть на него указатель), заполняет его данными и кладет в очередь «полных ящиков».
потребитель делает все наоборот:
- берет из очереди полных ящиков полный (то есть указатель на блок данных), делает что надо с ним, и кладет указатель в очередь пустых ящиков.
очередь реализуется на мьютексе и двух условных переменных, они скрыты внутри обьекта очередь.
мьютекс внутри очереди лочится только в момент заталкивания или выборки обьекта из нее. поскольку коллизия может быть только в этом месте.
ps
если поток-поставщик пытается получить пустой ящик из очереди пустых, но ящика там нет(туда его еще не положили) - поставщик засыпает на внутренней условной переменной очереди - и становится «ожидающим поставщиком». как только ящик туда положат, ожидающие поставщики(или самый первый ожидающий) будут разбужены, и заберут ящик.
то есть, если ты читаешь из очереди и она пуста - поток засыпает, это блокирующая операция.
и наоборот, если ты пишешь в очередь,и есть ограничение ее длины, и оно достигнуто - пишуший засыпает, до тех пор пока читающий не вытащит оттуда элемент. но это касается очередей с ограничением по длине.
Исходная версия alysnix, :
Суть в том что ты выделяешь кусочки памяти в декодере копируешь туда данные и отправляешь в очередь (массив) а енкодер по мере поступления от туда эти кусочки берёт и делает что-то с ними.
межтредовая очередь это полный аналог ленточного транспортера… N рабочих ставят свой ящик на транспортер и бегут за новым , и M рабочих берут ящики с транспортера и ставят например их на полки на складе.
схема называется поставщики/получатели.
если «ящики»(блоки данных) большие - они не копируются, а в очередь кладется указатель на блок.
для пущей скоросоти заранее берется X буферов(ящиков) и делаются две очереди. одна - «полных ящиков» передаваемых потребителям, и вторая - пустых ящиков - возвращаемых от потребителей к поставщикам.
поставщик:
- берет из очереди пустых ящиков пустой(становится его монопольным владельцем, ибо только у него есть на него указатель), заполняет его данными и кладет в очередь «полных ящиков».
потребитель делает все наоборот:
- берет из очереди полных ящиков полный (то есть указатель на блок данных), делает что надо с ним, и кладет указатель в очередь пустых ящиков.
очередь реализуется на мьютексе и двух условных переменных, они скрыты внутри обьекта очередь.
мьютекс внутри очереди лочится только в момент заталкивания или выборки обьекта из нее. поскольку коллизия может быть только в этом месте.