2013-04-14 13 views
26

Jaka jest różnica między future i shared_future?
W jakich przypadkach musimy użyć shared_future zamiast future?Jaka jest różnica między przyszłym a shared_future?

Próbowałem znaleźć dobrą dokumentację, która będzie kontrastować z tymi dwiema cechami C++ 11, i nie mogłem znaleźć odpowiedzi (łatwej do odczytania) w Internecie.

To jest moje obecne rozumienie różnic

  1. future obiekt może być wyświetlona tylko raz za get().
  2. shared_future może być zapytany dowolną liczbę razy.

przypadek użycia: Jeżeli wiele wątków są uzależnione od wyniku asynchronicznego zadania, to musimy użyć shared_future. Jeśli przyszły obiekt wymaga kilkukrotnego zapytania w tym samym wątku, musimy zamiast tego użyć shared_future.

żadnych dodatkowych informacji, pułapek lub ogólne wskazówki są mile widziane ...

Odpowiedz

30

Motywacją dla tych dwóch przyszłych typów sięga przenieść semantykę, move-tylko typy, a nowy C++ 11 funkcji powrotu ruch - tylko typy ze zwykłych funkcji.

w C++ 98/03 jeśli chciał wrócić typ z funkcji fabrycznego:

A 
make_A() 
{ 
    A a; 
    // ... 
    return a; 
} 

następnie A musiał być CopyConstructible. Następnie, zupełnie nowy w C++ 11, możemy zwrócić A, nawet jeśli nie jest to CopyConstructible, to musi być tylko MoveConstructible.

Ale co się stanie, jeśli spróbujesz jednocześnie wykonać make_A, np. Używając kontraktów futures. Czy nie byłoby przestępstwem, gdybyś mógł zrównoleglić tylko make_A, jeśli A jest CopyConstructible?! Musiałbyś zrezygnować z jednej optymalizacji podczas gonienia innej!

Więc future<R> wymaga tylko R, aby być MoveConstructible. Ale możesz go zdobyć tylko raz, ponieważ przechodzisz z zapisanego wyniku.

Ale uzyskanie tego samego wyniku dla wielu wątków jest również prawdziwą potrzebą. Tak więc pozwala na to shared_future<R>, ale wymaga R, aby być CopyConstructible.

+4

Więc nie tylko, że R w shared_future muszą być kopiowaneConstructible, są one faktycznie kopiowane, gdzie jak w przyszłości , dostęp nie będzie kopiować i tylko przenieść. Oznacza to, że domyślnie użyjemy przyszłego , ponieważ jest on szybszy i jeśli chcemy, użyj shared_future . Prawidłowo? –

+3

@Ajeet: Dokładnie to wynika z nazewnictwa 'future' i' shared_future'. Na początku były 'unique_future' i' shared_future' i było dużo dyskusji na temat tego, który z nich powinien być "domyślny". I cokolwiek powinno być domyślne, powinno się nazywać "przyszłość". W momencie podejmowania tej decyzji, semantyka ruchu była wciąż bardzo nowa dla komitetu C++, a nie tak dobrze rozumiana.Powierzam komitetowi C++ mądry skok wiary w przypisywanie prostszej nazwy "przyszłości" do "unique_future". –

Powiązane problemy