Информация об изменениях

Сообщение Re[3]: Swap 2 buffers от 09.08.2019 4:29

Изменено 09.08.2019 4:31 Ssd13

Re[3]: Swap 2 buffers
N>Как обычно в этих случаях и работает: в один буфер пишем со звуковой карты, а другой слушаем — потом меняем, в один буфер рисуем, а другой выводим на экран — потом меняем. Приём старый, решается мьютексами и condition variable, а мне интересно без них.

Массив из двух структур данные, флаг готовности данных и мьютекс. Потребитель захватывает мьютекс и если данные готовы — обрабатывает, сбрасывает флаг, отпускает мьютекс. Производитель наоборот, захватывает мьютекс, если буфер чист, записывает данные, ставит флаг, отпускает мьютекс. Только надо что-то придумать, чтобы не получилось, что при отсутствии данных в обоих структурах потребитель начнет их перебирать очень быстро, а производитель заполнит оба буфера и потребитель считает сначала более поздние данные. Можно, например, завести атомарный счетчик, сколько буферов заполнил производитель, чтобы потребитель делал count%2 и пытался захватить мьютекс на этой структуре с данными. Или каждый производитель и потребитель ведут свой счетчик (неатомарный) и не пытаются захватывать мьютекс на неподходящей структуре с буфером.
Re[3]: Swap 2 buffers
N>Как обычно в этих случаях и работает: в один буфер пишем со звуковой карты, а другой слушаем — потом меняем, в один буфер рисуем, а другой выводим на экран — потом меняем. Приём старый, решается мьютексами и condition variable, а мне интересно без них.

Массив из двух структур: данные, флаг готовности данных и мьютекс. Потребитель захватывает мьютекс и если данные готовы — обрабатывает, сбрасывает флаг, отпускает мьютекс. Производитель наоборот, захватывает мьютекс, если буфер чист, записывает данные, ставит флаг, отпускает мьютекс. Только надо что-то придумать, чтобы не получилось, что при отсутствии данных в обоих структурах потребитель начнет их перебирать очень быстро, а производитель заполнит оба буфера и потребитель считает сначала более поздние данные. Можно, например, завести атомарный счетчик, сколько буферов заполнил производитель, чтобы потребитель делал count%2 и пытался захватить мьютекс на этой структуре с данными. Или каждый производитель и потребитель ведут свой счетчик (неатомарный) и не пытаются захватывать мьютекс на неподходящей структуре с буфером.