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
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. –
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? –
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