LINUX.ORG.RU

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

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

Не понял что там за 12 потоков в один выход. Вроде ж про два разговор.

Ладно:

Один мьютекс, буфер А и буфер Б. Потоки декодера и энкодера лочат по одному буферу за раз и только в момент записи или чтения (копирования, от себя или к себе). Состояния буферов булевые: записан или прочитан. Оба треда, каждый сам по себе, подходят к буферам по очереди, сначала А, потом Б и так бесконечно. При старте оба буфера в состоянии прочитано.

Энкодер: залочили мьютекс, проверили что там стоит флаг прочитано, записали, поставили флаг записано, разлочили, ушли лопатить следующий кадр. Пришли к буферу Б, делаем аналогично А. Если состояние буфера говорит, что из него еще не прочитано, увы и ах — придется скипать кадр и не писать его в буфер.

Декодер: залочили мьютекс, проверили что там стоит флаг записано, прочитали, поставили флаг прочитано, разлочили, ушли отдавать полученый кадр. Пришли к буферу Б, делаем аналогично А. Если состояние буфера говорит, что в него еще ничего не записано, увы и ах — придется отдать ранее забранный кадр.

Да, мьютекс один, использовать аки лок, а не трайлок - при попадании в ожидание, там ждать микросекунды, лишь окончания записи или чтения + смены флага состояния.

Исходная версия deep-purple, :

Не понял что там за 12 потоков в один выход. Вроде ж про два разговор.

Ладно:

Один мьютекс, буфер А и буфер Б. Потоки декодера и энкодера лочат по одному буферу за раз и только в момент записи или чтения (копирования, от себя или к себе). Состояния буферов булевые: записан или прочитан. Оба треда, каждый сам по себе, подходят к буферам по очереди, сначала А, потом Б и так бесконечно. При старте оба буфера в состоянии прочитано.

Энкодер: залочили мьютекс, проверили что там стоит флаг прочитано, записали, поставили флаг записано, разлочили, ушли лопатить следующий кадр. Пришли к буферу Б, делаем аналогично А. Если состояние буфера говорит, что из него еще не прочитано, увы и ах — придется скипать кадр и не писать его в буфер.

Декодер: залочили мьютекс, проверили что там стоит флаг записано, прочитали, поставили флаг прочитано, разлочили, ушли отдавать полученый кадр. Пришли к буферу Б, делаем аналогично А. Если состояние буфера говорит, что в него еще ничего не записано, увы и ах — придется отдать ранее забранный кадр.