Мне кажется, что ваше чтение и предварительная обработка могут выполняться независимо от контейнера.
Наивно, я бы структурировал это как разветвление, а затем разветвление сети задач.
Сначала выполните диспетчеризацию задача (задача - это единица работы, которая передается потоку для фактической работы), которая будет создавать задачи ввода и предварительной обработки.
Использовать фьючерсыкак средство для подзадач для передачи указателя на полностью загруженное изображение.
Создайте вторую задачу, задачу std :: vector builder , которая просто вызывает join
набудущее, чтобы получить результаты, когда они будут сделаны, и добавить их в массив std::vector
.
Я предлагаю вам структурировать вещи таким образом, потому что я подозреваю, что любой ввод-вывод и предварительная обработка, которые вы делаете, займет больше времени, чем установказначение в векторе.Использование tasks вместо потоков напрямую позволяет настроить параллельную часть вашей работы.
Я надеюсь, что это не слишком отвлечено от конкретных элементов.Я считаю, что эта схема хорошо сбалансирована между насыщением доступного оборудования, снижением конкуренции за блокировку и блокировку, и понятна в будущем - вы отладите его позже.