c++ multithreading c++11 stdasync

c++ - Cuándo usar std:: async vs std:: threads?



multithreading c++11 (2)

En realidad, no se trata de una cosa de uno u otro : puede usar futuros (junto con promesas) con std :: threads creados manualmente. El uso de std::async es una forma conveniente de desencadenar un hilo para algunos cálculos asincrónicos y ordenar el resultado a través de un futuro, pero std::async es bastante limitado en el estándar actual. Será más útil si se aceptan las extensiones sugeridas para incorporar algunas de las ideas del PPL de Microsoft.

Actualmente, std::async es probablemente el más adecuado para el manejo de cálculos de ejecución muy larga o IO de larga ejecución para programas bastante simples. Sin embargo, no garantiza baja sobrecarga (y de hecho, la forma en que se especifica dificulta la implementación con un grupo de subprocesos detrás de las escenas), por lo que no es adecuada para cargas de trabajo de granularidad más fina. Para eso, o bien necesita desplegar sus propios grupos de subprocesos usando std::thread o usar algo como PPL de Microsoft o TBB de Intel.

También puede usar std::thread para el código de estilo de código POSIX ''tradicional'' escrito de una manera más moderna y portátil.

Bartosz Milewski discute algunas de las limitaciones de la forma en que std::async encuentra actualmente especificada en su artículo Async Tasks en C ++ 11: Aún no hay suficiente.


Una razón simple que he encontrado es el caso cuando desea una forma de detectar (mediante sondeo) si se realiza un trabajo asíncrono. Con std::thread , debes administrarlo tú mismo. Con std::async puedes consultar std::future::valid() (o usar std::future::wait_for/wait_until(...) ) para saber cuándo está hecho.