Вместо того, чтобы использовать очередь блокировки и вытягивать из нее рабочие потоки, присвойте каждому потоку свою собственную очередь и сделайте так, чтобы поток ввода-вывода выдавал пакеты работы в очередь каждого потока.
Круговая очередь была бы очень полезна для этого, предполагая, что вы не возражаете предпринять дополнительные усилия для реализации какого-либо способа отслеживания того, сколько еще элементов может быть помещено в каждую очередь;вам следует быть осторожным, чтобы не перезаписать необработанные записи, если поток ввода-вывода читает новые записи быстрее, чем рабочий поток обрабатывает их.
Один из способов гарантировать, что записи не будут перезаписаны, заключается в наличии рабочегоПотоки отправляют сообщение, чтобы обновить поток ввода-вывода с тем, сколько записей было обработано, очень часто.Этот подход не требует блокировки;только элементарная операция для обновления потока ввода-вывода время от времени.
Помимо этого, вы также можете добиться большей производительности, используя неблокирующий ввод-вывод для чтения большего количества записей, пока вы нажимаетепоследняя партия в очереди.Это также помогает узнать, является ли узким местом доступ к диску или его обработка.