با استفاده از std::async می توانید عملیاتهای آسنکرون (همزمانی) برای الگوریتم های خود تهیه کنید. الگوی الگوریتمی که در اینجا مطرح شده است بر اساس تکنیک تقسیم وظایف (Divide By Concur Fork/Join Method) طراحی شده است که میتوان یک مقدار آستانه (Threshold) که ما در این مثال 1000 تعریف کرده ایم تعریف کنید براساس همین مقدار متدها را به صورت بازگشتی با مقادیر مختلف اجرا کنید و در نهایت با استفاده از کلاس std::future مقادیر تمامی task ها را با هم یکسان کرد و در خروجی نمایش داد.
در مثال فوق پارامتر اول تابع parallel_sum به تعداد پارامترا دوم در هم جمع خواهد شد.
برای تکنیک فوق با استفاده از کلاس Fork/JoinTask یک مثال هم برای جاوا ر تالار جاوا قرار داده ام.
حتما باید از کامپایلر C++11 استفاده نمایید.
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <future>
template <typename DividedValue>
int parallel_sum(DividedValue beg, DividedValue end)
{
auto len = end - beg;
if (len < 1000) // divide and conquer
return std::accumulate(beg, end, 0);
DividedValue mid = beg + len/2;
auto handle = std::async(std::launch::async,
parallel_sum<DividedValue>, mid, end);
int sum = parallel_sum(beg, mid);
return sum + handle.get();
}
int main()
{
std::vector<int> v(110000, 1000);
std::cout << "The sum is " << parallel_sum(v.begin(), v.end()) << '\n';
}