История изменений
Исправление deep-purple, (текущая версия) :
Не понял что там за 12 потоков в один выход. Вроде ж про два разговор.
Ладно:
Один мьютекс, буфер А и буфер Б. Потоки декодера и энкодера лочат по одному буферу за раз и только в момент записи или чтения (копирования, от себя или к себе). Состояния буферов булевые: записан или прочитан. Оба треда, каждый сам по себе, подходят к буферам по очереди, сначала А, потом Б и так бесконечно. При старте оба буфера в состоянии прочитано.
Энкодер: залочили мьютекс, проверили что там стоит флаг прочитано, записали, поставили флаг записано, разлочили, ушли лопатить следующий кадр. Пришли к буферу Б, делаем аналогично А. Если состояние буфера говорит, что из него еще не прочитано, увы и ах — придется скипать кадр и не писать его в буфер.
Декодер: залочили мьютекс, проверили что там стоит флаг записано, прочитали, поставили флаг прочитано, разлочили, ушли отдавать полученый кадр. Пришли к буферу Б, делаем аналогично А. Если состояние буфера говорит, что в него еще ничего не записано, увы и ах — придется отдать ранее забранный кадр.
Да, мьютекс один, использовать аки лок, а не трайлок - при попадании в ожидание, там ждать микросекунды, лишь окончания записи или чтения + смены флага состояния.
Исходная версия deep-purple, :
Не понял что там за 12 потоков в один выход. Вроде ж про два разговор.
Ладно:
Один мьютекс, буфер А и буфер Б. Потоки декодера и энкодера лочат по одному буферу за раз и только в момент записи или чтения (копирования, от себя или к себе). Состояния буферов булевые: записан или прочитан. Оба треда, каждый сам по себе, подходят к буферам по очереди, сначала А, потом Б и так бесконечно. При старте оба буфера в состоянии прочитано.
Энкодер: залочили мьютекс, проверили что там стоит флаг прочитано, записали, поставили флаг записано, разлочили, ушли лопатить следующий кадр. Пришли к буферу Б, делаем аналогично А. Если состояние буфера говорит, что из него еще не прочитано, увы и ах — придется скипать кадр и не писать его в буфер.
Декодер: залочили мьютекс, проверили что там стоит флаг записано, прочитали, поставили флаг прочитано, разлочили, ушли отдавать полученый кадр. Пришли к буферу Б, делаем аналогично А. Если состояние буфера говорит, что в него еще ничего не записано, увы и ах — придется отдать ранее забранный кадр.