implementacja future :: then () odpowiednika dla wykonywania asynchronicznego w c ++ 11
Mam kilka pytań dotyczących implementacji funkcjithen()
wRozmowa Herb Suttera. Ta funkcja służy do łączenia parametrów asynchronicznychf
to przyszłość z jednej operacji i parametruw
jest „pracą” dla tej operacji (lambda).
template <typename Fut, typename Work>
auto then(Fut f, Work w) -> future<decltype(w(f.get()))>
{
return async([=]{ w(f.get()); });
}
Przykładem zastosowania może być:
std::future<int> f = std::async([]{
std::this_thread::sleep_for(std::chrono::microseconds(200));
return 10;
});
auto f2 = then(std::move(f), [](int i){
return 2 * i;
});
Główny wątek tworzy zadania, ale nie czeka na zakończenie żadnego z nich.
Po pierwsze,future<T>
nie ma konstruktora kopii. Oznacza to, że sugerowana implementacja może być używana tylko zshared_future<T>
chyba że zmienimy połączenie naasync()
przenieść przyszłość w lambdę.To pytanie SO zasugerował sposób na zrobienie tego, ale wydaje się zbyt skomplikowany. Ponownie zaimplementowałem funkcję i zastanawiam się, czy mój kod jest poprawny, czy też coś przeoczyłem ...
Po drugie, przyszłość przekazywanathen()
funkcja może byćvoid
więc potrzebujemy 2 implementacjithen()
, dobrze? Jeden dla transakcji terminowychT
i jeden dla transakcji terminowychvoid
.
Wreszcie, lambda wewnątrz ciałathen()
nie masz instrukcji zwrotu, abyśmy mogli zwrócić wartość z powrotem? Bez instrukcji powrotu, a następnie wracafuture<void>
, dobrze?
Próbowałem zająć się powyższymi punktami i oto, co wymyśliłem. Czy to jest poprawne?
template <typename T, typename Work>
auto then(future<T> f, Work w) -> future<decltype(w(f.get()))>
{
return async([](future<T> f, Work w)
{ return w(f.get()); }, move(f), move(w));
}
template <typename Work>
auto then(future<void> f, Work w) -> future<decltype(w())>
{
return async([](future<void> f, Work w)
{ f.wait(); return w(); }, move(f), move(w));
}