«Я бы хотел, чтобы производитель приостановил чтение данных с диска, если в данный момент вычисляется более n блоков».Реальное описание задачи немного отличается: производитель, прежде чем читать данные с диска, должен получить разрешение на это .Если ваш производитель - нить, то естественным средством управления разрешениями будет Семафор .Изначально он содержит n разрешений.Производитель, чтобы прочитать блок, получает 1 разрешение с Semaphore::aquire
.Когда блок обрабатывается потребителем, потребитель выпускает 1 разрешение с Semaphore::release
.
. Другой подход состоит в объединении блоков и разрешений.Аналогично очереди вывода от производителя к потребителю, создайте очередь блокировки ввода для блоков.Изначально положил туда n блоков.Производитель, чтобы прочитать блок, сначала берет следующий блок из этой очереди.Потребитель после обработки блока возвращает его в очередь ввода.