Я хотел бы запускать задачи (рабочие потоки) одного типа, но не более определенного количества задач за раз. Когда задача заканчивается, ее результатом является ввод для новой задачи, которая затем может быть запущена.
Есть ли хороший способ реализовать это с помощью асинхронной/будущей парадигмы в С++ 11?
На первый взгляд, он выглядит прямо, вы просто создаете несколько задач с помощью:
std::future<T> result = std::async(...);
и затем запустите result.get()
, чтобы получить асинхронный результат задачи.
Однако проблема заключается в том, что будущие объекты должны храниться в какой-то очереди и их следует ждать один за другим. Тем не менее, возможно повторять итерации над будущими объектами снова и снова, проверяя, готов ли какой-либо из них, но это нежелательно из-за ненужной загрузки ЦП.
Возможно ли каким-то образом ожидать любого будущего от данного набора, чтобы быть готовым и получить его результат?
Единственный вариант, о котором я могу думать до сих пор, - это подход старой школы без асинхронного/будущего. В частности, нереста нескольких рабочих потоков и в конце каждого потока нажимают свой результат в защищенную mutex очередь, уведомляя поток ожидания через переменную условия, что очередь была обновлена с большим количеством результатов.
Есть ли еще лучшее решение с асинхронным/будущим?