синхронизация ввода / вывода с двойным буфером - PullRequest
0 голосов
/ 25 марта 2011

Если у меня есть приложение, которое генерирует данные медленно, но быстро их потребляет, будет ли это хорошим кандидатом для реализации двойного буфера?Основная идея заключается в том, чтобы производитель заполнил задний буфер, пока потребитель обрабатывает передний буфер.Я не хочу, чтобы клиент выглядел так, как будто он ожидает данных.Я хочу сбалансировать производство и потребление.Как я могу достичь этой функциональности?Даже если у меня есть резервный буферный поток .... он должен быть синхронизирован с фронтальным буферным потоком, чтобы фронтальный буфер знал, когда появляются новые данные (буферы были заменены).Если поток обратного буфера занимает слишком много времени, чтобы произвести свои данные, тогда переднему буферу придется ждать, чтобы обработать его.

void fill_back_buffer() {

   //wait to fill buffer
   //fill back buffer


   //swap buffers and notify other thread
}

void process_data() {

  //wait to see if buffers have been swapped


  //buffers been swapped so send data out
  //while sending data out start filling back buffer with new data
}

1 Ответ

2 голосов
/ 25 марта 2011

Если ваше приложение «создает данные медленно, но потребляет их быстро», это ограничит выгоды, которые вы можете получить от двойной буферизации.

Если для создания буфера, заполненного данными, требуется 10 секунд, а для его использования - 1 секунда, двойная буферизация может увеличить вашу пропускную способность на 10%, но если на создание и использование обоих потребуется одинаковое количество времени, двойная буферизация может удвоить пропускную способность.

Например:

  • Время_ производства = 10 секунд
  • потребление_время = 1 секунда
  • количество буферов = 100

последовательная обработка = 100 * (10 + 1) = 1100 секунд
с двойной буферизацией = 100 * 10 = 1000 секунд

Но, если мы изменим параметры, потребляем время = 10 секунд:

последовательная обработка = 100 * (10 + 10) = 2000 секунд
с двойной буферизацией = 100 * 10 = 1000 секунд

...