Entiendo lo que std::async
hace con los siguientes parámetros.std :: async - std :: launch :: async | std :: launch :: deferred
std::launch::async
std::launch::deferred
Sin embargo lo que sucede con, std::launch::async | std::launch::deferred
?
Entiendo lo que std::async
hace con los siguientes parámetros.std :: async - std :: launch :: async | std :: launch :: deferred
std::launch::async
std::launch::deferred
Sin embargo lo que sucede con, std::launch::async | std::launch::deferred
?
Una política de lanzamiento de std::launch::async | std::launch::deferred
significa que la implementación puede elegir aplicar una política de std::launch::async
o std::launch::deferred
. Esta elección puede variar de llamada a llamada, y no se puede decidir de inmediato.
Una implementación que siempre elige uno u otro es por lo tanto legal (que es lo que gcc, eligiendo siempre diferido), como es el que elige std::launch::async
hasta que se alcanza cierto límite, y luego cambia a std::launch::deferred
.
También significa que la implementación puede diferir la elección hasta más tarde. Esto significa que la implementación puede esperar para tomar una decisión hasta que su mano sea forzada por una llamada que tenga efectos visiblemente distintos de las tareas diferidas y asíncronas, o hasta que el número de tareas en ejecución sea menor que el límite de la tarea interna. Esto es lo que hace just::thread.
Las funciones que obligan a la decisión son: wait()
, get()
, wait_for()
, wait_until()
, y el destructor del último objeto futura referencia al resultado.
Chaprer 30.6.8 de la norma ISO IEC 14882 hasta 2011 explica que launch::async | launch::deferred
significa implementations should defer invocation or the selection of the policy when no more concurrency can be effectively exploited
(igual que async
sin policy
parámetro).
En la práctica, significa que el tiempo de ejecución de C++ debe iniciar nuevos subprocesos para cada async
, siempre que haya núcleos de CPU no utilizados.
Sí, lo vi, pero ¿qué significa eso en la práctica? – ronag
Encontré la cita siguiente que me dejó más claro: "depende de la implementación si se realiza una ejecución asincrónica o una evaluación diferida". – ronag
Offtopic: ¿Pero qué ocurre con los lanzamientos diferidos cuando '.get()' nunca se llama y el futuro simplemente se destruye? – ronag
¿Qué, gcc siempre usa 'diferido'? Agradable, mucho para "dejar que la implementación decida qué es lo mejor para ti";) –