Piszę kod wielowątkowy i używając obietnicy/przyszłości wywołuję funkcję na innym wątku i zwracam jej wynik. Dla simplicitly, usunę gwintu udział w całości:Wypełnij obietnicę (prawdopodobnie nieważną)
template <typename F>
auto blockingCall(F f) -> decltype(f())
{
std::promise<decltype(f())> promise;
// fulfill the promise
promise.set_value(f());
// block until we have a result
return promise.get_future().get();
}
Działa to doskonale dla każdej funkcji, która zwraca nieprzestrzegania void
. Oświadczenie zwrotu dotyczące przyszłości również działa dla void
. Ale nie mogę spełnić obietnicę jeśli f
jest void
funkcja, ponieważ:
promise.set_value (f()); // błąd: nieprawidłowe użycie void ekspresji
Czy jest jakiś sprytny sposób ustalania wartości w przypadku in-line void
, czy mam po prostu napisać funkcję pomocnika jak call_set_value(promise, f)
który ma przeciążeń dla std::promise<R>
i std::promise<void>
?
Nie mam umiejętności związanych z szablonem, aby to zrobić samodzielnie, ale mam wrażenie, że prawdopodobnie można SFINAE na typem zwrotu. – Borgleader
Jaki jest dokładnie sens wywoływania funkcji w innym wątku, jeśli masz zamiar poczekać, aż połączenie zostanie wykonane? (Z wyjątkiem oczywistego przypadku wysłania wywołania do * określonego * wątku). – cdhowie
Dlaczego korzystasz z obietnicy niskiego poziomu - możesz po prostu użyć std :: future –