Ja bym to napisał tak:
#include <iostream>
#include <thread>
#include <future>
#include <vector>
#include <cstddef>
void iloczyn_skalarny(std::vector<double> a, std::vector<double> b, std::promise<double>& pro)
{
double result = 0.0;
std::size_t idx = a.size();
while(idx--) {
result += a[idx] * b[idx];
}
pro.set_value_at_thread_exit(result);
}
constexpr static std::size_t N = 10;
int main()
{
std::vector<double> a = {2, 3, 4};
std::vector<double> b = {5, 6, 7};
std::promise<double> pro[N];
for(auto& pr: pro) {
std::thread(iloczyn_skalarny, a, b, std::ref(pr)).detach();
}
double result = 0.0;
for(auto& pr: pro) {
result += pr.get_future().get();
}
std::cout << result << '\n';
}
Obiekt std::promise, wymaga pobrania std::future aby uzyskać informację o wartości ustawianej w std::promise. Z zasady, std::promise służy do ustawiania wartości oraz ew. wyjątku ( jego set_exception(...) ). Tak wartość jak i wyjątek (będzie rzucony w momencie uzyskania wartości), można uzyskać z std::future wyprowadzonej z std::promise.
Wynik skalarnego iloczynu ustawiany być powinien na zakończeniu działania wątku ( pro.set_value_at_thread_exit(result) ) . Stąd jak już będzie ustawiony, jest pewne że wątek już nie działa. Nie jest pewne że nie działa jeśli robisz zwykłe ustawienie ( pro.set_value(result) ). Tak, to raczej zły zbieg okoliczności jeśli jeszcze działa bo przecież "ten set.. jest ostatni". Przy aplikacjach wielowątkowych, przyjmij że zły zbieg okoliczności zawsze zachodzi... to jest pewne :-/
Przy takiej obsłudze nie ma sensu czekać na zakończenie wątku, stąd jest on odłączany ( std::thread(iloczyn_skalarny, a, b, std::ref(pr)).detach(); ). Całość aplikacji, synchronizowana jest przez pobranie wartości z std::future wyprowadzonego z std::promise.
Dodatkowo polecono Ci, aby wyświetlić sumę wyników iloczynów skalarnych. Oczywiście nie ma to większego logicznego sensu... no ale to ćwiczenie :) Dlatego sumuję w pętli w main() wszystkie std::future wyprowadzone z std::promise w tablicy.
Nie ma także sensu w każdym przypadku pracowicie iterować w zakresie [0, 10) tradycyjnym for(...). Wiadomo że elementów jest 10 bo tyle ma tablica pro[...].