Самый простой способ
Как насчет возврата лямбды f(x)
вместо x:
for (std::size_t i = 0; i < n; ++i)
results.push_back(std::async([]() -> int { /* ... */ }));
В этом случае f()
может быть выполнено как можно скорее и без ожидания. Среднее вычисление все еще должно было бы ждать в последовательном порядке. Но это ложная проблема, поскольку нет ничего быстрее суммирования целых чисел, и в любом случае вы не сможете закончить вычисление среднего значения, прежде чем суммировать каждую часть.
Легкая альтернатива
Еще одним подходом может быть использование atomic<int> mean;
, захват его в лямбда-выражении и обновление суммы. Так что, в конце концов, вам нужно только быть уверенным, что все будущее доставлено, прежде чем делать деление. Но, как уже говорилось, учитывая стоимость целочисленного сложения, это может быть излишним.
std::vector<std::future<void>> results;
...
atomic<int> mean{0};
for (std::size_t i = 0; i < n; ++i)
results.push_back(std::async([&mean]() -> void
{ X x = ...; int i=f(x); mean+=i; return; }));
for (std::size_t i = 0; i < n; ++i)
results[i].get();
mean = mean/n; // attention not an atomic operation, but all concurent things are done