In den Worten von [futures.state] ein std::future
ist ein asynchrones Rückgabeobjekt ("ein Objekt, das Ergebnisse aus einem gemeinsamen Zustand liest") und ein std::promise
ist ein asynchroner Anbieter ("ein Objekt, das ein Ergebnis für einen gemeinsamen Zustand liefert"), d.h. ein Versprechen ist das, was Sie einstellen. ein Ergebnis an, so dass Sie erhalten. es aus der damit verbundenen Zukunft.
Der asynchrone Anbieter erstellt zunächst den gemeinsamen Zustand, auf den sich ein Future bezieht. std::promise
ist ein Typ eines asynchronen Anbieters, std::packaged_task
ist eine andere, und das interne Detail von std::async
ist eine andere. Jedes dieser Elemente kann einen gemeinsamen Zustand schaffen und Ihnen eine std::future
der diesen Zustand teilt, und kann den Zustand bereit machen.
std::async
ist ein übergeordnetes Dienstprogramm, das Ihnen ein asynchrones Ergebnisobjekt liefert und sich intern um die Erstellung des asynchronen Anbieters und die Bereitstellung des gemeinsamen Zustands bei Beendigung der Aufgabe kümmert. Man könnte es mit einer std::packaged_task
(oder std::bind
und eine std::promise
) und eine std::thread
aber es ist sicherer und einfacher zu benutzen std::async
.
std::promise
ist etwas einfacher, wenn Sie ein asynchrones Ergebnis an die Zukunft übergeben wollen, aber der Code, der das Ergebnis bereitstellt, kann nicht in einer einzigen Funktion verpackt werden, die zur Übergabe an std::async
. Sie könnten zum Beispiel ein Array mit mehreren promise
s und zugehörige future
s und haben einen einzigen Thread, der mehrere Berechnungen durchführt und für jedes Versprechen ein Ergebnis festlegt. async
nur ein einziges Ergebnis zurückgeben würde, müssten Sie für mehrere Ergebnisse async
mehrmals, was zu einer Verschwendung von Ressourcen führen kann.