2014-09-12 14 views
30

Kann jemand eine hohe Intuition darüber geben, wann man jeden von ihnen benutzt?Wann std :: async vs. std :: threads verwenden?

Referenzen:

+0

Verwenden Sie den, den Sie für Ihr Problem anwenden können. Manche Probleme passen besser zu dem einen oder anderen, und das wird sich natürlich in Ihrem Denken widerspiegeln. –

+0

Aber sind sie gleichwertig? Das glaube ich nicht. Wird std :: async nur gemacht, um das Leben einfacher zu machen oder um ein vorheriges C++ Problem zu lösen? –

+2

Interessantes lesen (in Bezug auf 'std :: async'), wenn Sie g ++ verwenden: [async (f) ist nicht.] (Https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51617), und auch [this] (http://stackoverflow.com/questions/17963172/why-using-stdasync-from-c11) – streppel

Antwort

28

Es ist nicht wirklich ein entweder-oder Sache - Sie Futures verwenden können (zusammen mit dem Versprechen) mit std manuell erstellt :: Themen . Die Verwendung von std::async ist eine bequeme Möglichkeit, einen Thread für eine asynchrone Berechnung auszulösen und das Ergebnis über eine Zukunft zurück zu übertragen, aber std::async ist im aktuellen Standard ziemlich begrenzt. Es wird nützlicher werden, wenn die vorgeschlagenen Erweiterungen, die einige Ideen von Microsofts PPL enthalten, akzeptiert werden.

Momentan ist std::async wahrscheinlich am besten geeignet, entweder sehr lange laufende Berechnungen oder lang laufende IO für ziemlich einfache Programme zu behandeln. Es garantiert jedoch keinen geringen Overhead (und die Art, wie es spezifiziert ist, macht es schwierig, mit einem Thread-Pool hinter den Kulissen zu implementieren), so dass es für feinkörnigere Workloads nicht gut geeignet ist. Dafür müssen Sie entweder Ihre eigenen Thread-Pools mit std::thread rollen oder etwas wie Microsofts PPL oder Intels TBB verwenden.

Sie können auch std::thread für "traditionellen" POSIX-Thread-Code verwenden, der auf eine modernere und portablere Weise geschrieben wurde.

Bartosz Milewski werden einige der Beschränkungen der Art und Weise std::async zur Zeit in seinem Artikel angegeben Async Tasks in C++11: Not Quite There Yet

+0

Wenn ich also effizienten Code schreiben möchte (oder Threads, die häufig erstellt und verknüpft werden) ist es besser, sich an klassische Fäden zu halten? –

+2

Well Threads erstellt und häufig verbunden ist, was Sie für effizienten Code vermeiden wollen :) Das ist das Problem mit std :: async - es ist sehr wahrscheinlich, dass durch das Abfeuern eines neuen Thread statt mit einem Thread-Pool implementiert werden. Wenn Sie effiziente feinkörnige Thread-Workloads benötigen, möchten Sie im Allgemeinen einen Threadpool haben. – mattnewport

+1

@mattnewport: Tatsächlich verwendet ['std :: async' am häufigsten einen Threadpool] (http://stackoverflow.com/questions/15666443/which-stdasync-implementations-use-thread-pools). Aber es ist nicht erforderlich. –

4

Ein einfacher Grund, warum ich gefunden habe, ist der Fall, wenn Sie einen Weg (via Polling) erkannt werden soll, ob eine asynchrone Arbeit ist erledigt. Mit std::thread müssen Sie es selbst verwalten. Mit std::async können Sie std::future::valid() abfragen (oder std::future::wait_for/wait_until(...) verwenden), um zu wissen, wenn es getan wird.

Verwandte Themen