Map-Reduce на C++ с использованием std::async

223
26 ноября 2017, 14:58

Пытаюсь написать MapReduce.

#include <iostream>
#include <future>
#include <numeric>
#include <vector>
#include <list>
template <typename It, typename Func>
void map(It first, It last, Func f)
{
    while (first != last)
    {
        f(*first++);
    }
}
template <typename It, typename MapFunc, typename FoldFunc>
auto map_reduce(It first, It last, MapFunc f1, FoldFunc f2, size_t num_threads)
    -> decltype(f2(f1(*first), f1(*first)))
{
    size_t block_size = std::distance(first, last) / num_threads;
    std::vector<std::future<int>> results(num_threads);
    for (size_t i = 0; i < num_threads; ++i)
    {
        results[i] = std::async(map, first, last, f1);
    }
    return 0;
}

int main()
{
    std::list<int> ls = { 1, 2, 3 };
    auto sum = map_reduce(ls.begin(), ls.end(),
        [](int i) {return i; },
        std::plus<int>(),
        3);
    return 0;
}

Почему компилятор ругается на вызов std::async?

Как вообще реализовать эту концепцию, чтобы преобразование подпоследовательностей происходило в отдельных потоках, результаты потом сворачивались, и при этом исходная последовательность не изменялась?

Answer 1

Вы передаете шаблонную функцию map в шаблон же, и компилятор не понимает, что туда надо подсунуть.

Можно попробовать так:

results[i] = std::async(map<It,decltype(f1)>, first, last, f1);

только вот у вас results - это фьючерсы future<int>, а ваша map возвращает void...

Если исправить и это, то скомпилироваться она скомпилируется, ну, а что она делать будет - это я не смотрел.

READ ALSO
Как скомпилировать SDL 2.0 под MinGW

Как скомпилировать SDL 2.0 под MinGW

Целый день мучаюсь вроде все правильно делаю, все пути к библиотекамlib и

229
Не получается запустить более 4 потоков URLDownloadToFile

Не получается запустить более 4 потоков URLDownloadToFile

Имеется такая функция, которая нужно выполнять одновременно в 100 потоков

221
Проблема с загрузкой изображения через WinInet[Решено]

Проблема с загрузкой изображения через WinInet[Решено]

Здравствуйте! Пытаюсь загрузить картинку логотип гугла(https://wwwgoogle

242