Files
concurrency-in-action/source/listing_8.5.cpp
2018-10-18 00:40:34 -05:00

19 lines
649 B
C++

template <typename Iterator, typename T>
T
parallel_accumulate(Iterator first, Iterator last, T init)
{
unsigned long const length = std::distance(first, last);
unsigned long const max_chunk_size = 25;
if (length <= max_chunk_size) {
return std::accumulate(first, last, init);
}
else {
Iterator mid_point = first;
std::advance(mid_point, length / 2);
std::future<T> first_half_result =
std::async(parallel_accumulate<Iterator, T>, first, mid_point, init);
T second_half_result = parallel_accumulate(mid_point, last, T());
return first_half_result.get() + second_half_result;
}
}