Size: a a a

IT KPI C/C++ ХВ (не UB)

2020 October 13

АХ

Анна Хашпер... in IT KPI C/C++ ХВ (не UB)
Помогите мне, пожалуйста, разобраться с std::thread
источник

АХ

Анна Хашпер... in IT KPI C/C++ ХВ (не UB)
Есть рабочий пример. Для обычной функции (не шаблонной)
источник

АХ

Анна Хашпер... in IT KPI C/C++ ХВ (не UB)
источник

АХ

Анна Хашпер... in IT KPI C/C++ ХВ (не UB)
А мне нужно вызывать шаблонную
источник

АХ

Анна Хашпер... in IT KPI C/C++ ХВ (не UB)
template<typename It, typename UnFunc, typename BiFunc>
auto map(It p, It q, UnFunc f1, BiFunc f2)->decltype(f2(f1(*p), f1(*p)))
{
 using ResType = decltype(f2(f1(*p), f1(*p)));
 ResType res = f1(*p);
 while (++p != q)
   res = f2(res, f1(*p));
 return res;
}
источник

АХ

Анна Хашпер... in IT KPI C/C++ ХВ (не UB)
Вот так написала - не компилится
источник

АХ

Анна Хашпер... in IT KPI C/C++ ХВ (не UB)
std::vector <ResType> VectResult(threads);
 for (int i = 0; i < threads; i++)
 {
   ResType res;
   std::thread t([&res]() {res = map<It, UnFunc, BiFunc>(p, q, f1, f2);});
   t.join();
   VectResult[i] = res;
 }
источник

AB

Aleksey Belkevich in IT KPI C/C++ ХВ (не UB)
Анна Хашпер
std::vector <ResType> VectResult(threads);
 for (int i = 0; i < threads; i++)
 {
   ResType res;
   std::thread t([&res]() {res = map<It, UnFunc, BiFunc>(p, q, f1, f2);});
   t.join();
   VectResult[i] = res;
 }
У тебя здесь не идёт передачи типов для шаблонизации
источник

AB

Aleksey Belkevich in IT KPI C/C++ ХВ (не UB)
Проблема не с тредами, пробуй без них для начала
источник

AB

Aleksey Belkevich in IT KPI C/C++ ХВ (не UB)
Aleksey Belkevich
У тебя здесь не идёт передачи типов для шаблонизации
Точнее идёт, но некорректная, так как те параметры которые использовала это просто названия шаблонов
источник

АХ

Анна Хашпер... in IT KPI C/C++ ХВ (не UB)
It, UnFunc  и BiFunc - это типы
источник

AB

Aleksey Belkevich in IT KPI C/C++ ХВ (не UB)
Тогда скидывай полный листинг
источник

АХ

Анна Хашпер... in IT KPI C/C++ ХВ (не UB)
// реализация функции mapreduce
template<typename It, typename UnFunc, typename BiFunc>
auto map_reduce(It p, It q, UnFunc f1, BiFunc f2, size_t threads)->decltype(f2(f1(*p), f1(*p)))
{
 using ResType = decltype(f2(f1(*p), f1(*p)));
 size_t block_size = std::distance(p, q) / threads;
 
 std::vector<It> first(threads);
 std::vector<It> last(threads);
 int c = 0;
 for (int i = 0; i < threads; i++)
 {
   first[i] = p;
   while (c < (i+1)*block_size)
   {
     last[i] = ++p;
     c++;
   }
 }
 last[threads-1] = q;

 std::vector <ResType> VectResult(threads);
 for (int i = 0; i < threads; i++)
 {
   ResType res;
   std::thread t([&res]() {res = map<It, UnFunc, BiFunc>(p, q, f1, f2);});
   t.join();
   VectResult[i] = res;
 }

 /*std::vector<std::future<ResType>> VectFuture(threads);
 
 
 for (int i = 0; i < threads; i++)
 {
   VectFuture[i] = std::async(std::launch::async, map <It, UnFunc, BiFunc>, first[i], last[i], f1, f2);
 }
 ResType res = VectFuture[0].get();
 for (int i = 1; i < threads; i++)
 {
   res = f2(res, VectFuture[i].get());
 }*/

 return res;
}
источник

АХ

Анна Хашпер... in IT KPI C/C++ ХВ (не UB)
Не знаю, как в телеграме красиво код оформить. С подсветкой
источник

AB

Aleksey Belkevich in IT KPI C/C++ ХВ (не UB)
pastebin
источник

k

kvark in IT KPI C/C++ ХВ (не UB)
пастебин, я не могу прочитать
источник

АХ

Анна Хашпер... in IT KPI C/C++ ХВ (не UB)
источник

AB

Aleksey Belkevich in IT KPI C/C++ ХВ (не UB)
Анна Хашпер
// реализация функции mapreduce
template<typename It, typename UnFunc, typename BiFunc>
auto map_reduce(It p, It q, UnFunc f1, BiFunc f2, size_t threads)->decltype(f2(f1(*p), f1(*p)))
{
 using ResType = decltype(f2(f1(*p), f1(*p)));
 size_t block_size = std::distance(p, q) / threads;
 
 std::vector<It> first(threads);
 std::vector<It> last(threads);
 int c = 0;
 for (int i = 0; i < threads; i++)
 {
   first[i] = p;
   while (c < (i+1)*block_size)
   {
     last[i] = ++p;
     c++;
   }
 }
 last[threads-1] = q;

 std::vector <ResType> VectResult(threads);
 for (int i = 0; i < threads; i++)
 {
   ResType res;
   std::thread t([&res]() {res = map<It, UnFunc, BiFunc>(p, q, f1, f2);});
   t.join();
   VectResult[i] = res;
 }

 /*std::vector<std::future<ResType>> VectFuture(threads);
 
 
 for (int i = 0; i < threads; i++)
 {
   VectFuture[i] = std::async(std::launch::async, map <It, UnFunc, BiFunc>, first[i], last[i], f1, f2);
 }
 ResType res = VectFuture[0].get();
 for (int i = 1; i < threads; i++)
 {
   res = f2(res, VectFuture[i].get());
 }*/

 return res;
}
Поправил строку с созданием map, там пропустила название неймспейса
+ у тебя возвращается res, который создан локально внутри цикла
источник

AB

Aleksey Belkevich in IT KPI C/C++ ХВ (не UB)
В общем исправляешь две детали и сборка проходит успешно
источник

АХ

Анна Хашпер... in IT KPI C/C++ ХВ (не UB)
Насчет неймспейс не понимаю. Это не тот map, который std::map. Это мой, пользовательский
источник