Was ist der Unterschied zwischen packaged_task und async
Während der Arbeit mit dem Thread Modell von C++11, bemerkte ich, dass
std::packaged_task<int(int,int)> task([](int a, int b) { return a + b; });
auto f = task.get_future();
task(2,3);
std::cout << f.get() << '\n';
und
auto f = std::async(std::launch::async,
[](int a, int b) { return a + b; }, 2, 3);
std::cout << f.get() << '\n';
scheinen zu tun genau das gleiche. Ich verstehe, dass es einen großen Unterschied, wenn ich lief std::async
mit std::launch::deferred
, aber ist es in diesem Fall?
Was ist der Unterschied zwischen diesen beiden Ansätzen, und vor allem, in was Fällen verwenden sollte, ich benutze den einen über den anderen?
InformationsquelleAutor nijansen | 2013-08-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eigentlich das Beispiel, das Sie soeben gab, zeigt die Unterschiede, wenn Sie relativ lange funktionieren, wie
Verpackt Aufgabe
Einen
packaged_task
nicht anfangen, auf seine eigene, müssen Sie es aufrufen:std::async
Auf der anderen Seite
std::async
mitlaunch::async
wird versuchen, die Aufgabe in einem anderen thread:Nachteil
Aber, bevor Sie versuchen zu verwenden
async
für alles, Bedenken Sie, dass die zurückgegebenen Zukunft hat einen speziellen gemeinsamen Staat, die verlangt, dassfuture::~future
Blöcke:Also, wenn Sie wollen echte asynchrone, die Sie benötigen, um die zurückgegebenen
future
, oder wenn Sie kümmern sich nicht um das Ergebnis, wenn sich die Umstände ändern:Weitere Informationen hierzu finden Sie Herb Sutter Artikel
async
und~Zukunft
, die das problem beschreibt, und Scott Meyersstd::futures
vonstd::async
nicht besonderes, das beschreibt die Erkenntnisse. Auch beachten Sie, dass dieses Verhalten angegeben wurde in C++14, sondern Häufig auch umgesetzt in C++11.Weitere Unterschiede
Mithilfe
std::async
Sie nicht Ihre Aufgabe in einem bestimmten thread nicht mehr, wostd::packaged_task
können verschoben werden, um andere threads.Auch ein
packaged_task
muss aufgerufen werden, bevor Sie anrufenf.get()
- ansonsten können Sie Programm einfrieren, wie die Zukunft werden nie fertig:TL;DR
Verwenden
std::async
wenn Sie möchten, einige Dinge, die getan und nicht wirklich Pflege, wenn Sie fertig sind, undstd::packaged_task
wenn Sie wollen, wrap up, Dinge, um Sie zu bewegen, zu anderen threads, oder rufen Sie Sie später. Oder, Zitat Christian:Am Ende ein
std::packaged_task
ist nur ein niedriger level feature für die Umsetzungstd::async
(das ist, warum es mehr kann alsstd::async
wenn verwendet, zusammen mit anderen lower-level " - Sachen, wiestd::thread
). Einfach gesprochenstd::packaged_task
ist einstd::function
verbunden mit einerstd::future
undstd::async
wraps und fordert einestd::packaged_task
(evtl. in einem anderen thread).Ich bin dabei einige Experimente auf der ~Zukunft () - block. Ich konnte nicht replizieren, die blockierende Wirkung auf das künftige Objekt der Zerstörung. Alles funktioniert asynchron. Ich bin mit VS 2013 und wenn ich starten Sie den async, ich verwendet std::launch::async. Hat VC++ das irgendwie "fixen" dieses Problem?
Gut, N3451 ist eine akzeptierte Vorschlag, die (soweit ich weiß) ging in C++14. Gegeben, dass die Herb arbeitet bei Microsoft, ich würde nicht überrascht sein, wenn das feature implementiert ist in VS2013. Ein compiler folgt strikt der C++11 Regeln würde, zeigen noch dieses Verhalten.
Diese Antwort vorausgeht C++14 und C++17, so hatte ich nicht die Normen, sondern nur Vorschläge an die hand. Ich werde entfernen Sie den Absatz.
InformationsquelleAutor Zeta
InformationsquelleAutor Radoslav.B
Verpackt Aufgabe vs async
p> Verpackt Aufgabe hält eine Aufgabe
[function or function object]
und Zukunft/das Versprechen-pair-Mädchen. Wenn der task ausgeführt wird eine return-Anweisung, die es verursachtset_value(..)
auf diepackaged_task
's Versprechen.a> Gegeben, die Zukunft, das Versprechen und das Paket Aufgabe, die wir erstellen können einfache Aufgaben, ohne sich sorgen zu viel über threads [thread ist einfach nur etwas, das wir geben, um einen task auszuführen].
Allerdings müssen wir berücksichtigen, wie viele threads zu nutzen, oder ob Sie eine Aufgabe am besten ausführen, die auf den aktuellen thread oder auf einem anderen usw.Solche descisions können behandelt werden, indem eine thread-launcher namens
async()
, der entscheidet, ob um eine neue zu erstellen einen thread oder recyceln eine alte oder führen Sie einfach die Aufgabe auf den aktuellen thread. Es gibt eine Zukunft .InformationsquelleAutor