Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

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

#cpp #многопоточность #stl #async #шаблоны_с++


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

#include 
#include 
#include 
#include 
#include 

template 
void map(It first, It last, Func f)
{
    while (first != last)
    {
        f(*first++);
    }
}

template 
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> 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 ls = { 1, 2, 3 };
    auto sum = map_reduce(ls.begin(), ls.end(),
        [](int i) {return i; },
        std::plus(),
        3);

    return 0;
}


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

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


Ответы

Ответ 1



Вы передаете шаблонную функцию map в шаблон же, и компилятор не понимает, что туда надо подсунуть. Можно попробовать так: results[i] = std::async(map, first, last, f1); только вот у вас results - это фьючерсы future, а ваша map возвращает void... Если исправить и это, то скомпилироваться она скомпилируется, ну, а что она делать будет - это я не смотрел.

Комментариев нет:

Отправить комментарий