He estado pensando en std::async
y cómo uno debería usarlo en la futura implementación del compilador. Sin embargo, en este momento estoy un poco atrapado con algo que se siente como un defecto de diseño.std :: async: ¿uso dependiente de la implementación?
El std::async
depende de la implementación, probablemente con dos variantes de launch::async
, una que inicia la tarea en un nuevo hilo y otro que usa un grupo de hilos/programador de tareas.
Sin embargo, dependiendo de cuál de estas variantes se utilice para implementar std::async
, el uso podría variar mucho.
Para la variante basada en "pool de hilos", podría iniciar muchas tareas pequeñas sin preocuparse demasiado por los gastos generales, sin embargo, ¿qué ocurre si una de las tareas se bloquea en algún momento?
Por otro lado, una variante de "abrir un nuevo hilo" no tendría problemas con las tareas de bloqueo, por otro lado, la sobrecarga de ejecutar y ejecutar tareas sería muy alta.
hilos de la piscina: + baja sobrecarga, -nunca jamás bloquear
lanzamiento nuevo hilo: + bien con bloques, -alta sobrecarga
Así que, básicamente, en función de la aplicación, la forma en que usamos std::async
sería muy cuidadoso. Si tenemos un programa que funciona bien con un compilador, podría funcionar de manera horrible en otro.
¿Esto es por diseño? ¿O me estoy perdiendo algo? ¿Considerarías esto, como lo hago, como un gran problema?
En la especificación actual me falta algo así como std::oversubscribe(bool)
para permitir la implementación en uso dependiente de std::async
.
EDITAR: Hasta donde he leído, el documento estándar C++ 11 no da ninguna pista con respecto a si las tareas enviadas a std::async
pueden bloquear o no.
Solo como una adición: http://en.cppreference.com/w/cpp/thread/async proporciona un ejemplo bastante simple y realista de bloqueo de llamadas 'std :: async'. – KillianDS
Parece que asume que los grupos de subprocesos tienen un tamaño fijo. En la práctica, muchos tienen un tamaño dinámico, por lo que el bloqueo no es un problema. –
@MooingDuck: ni TBB ni Concrt tienen grupos de subprocesos de tamaño "dinámico". ¿Qué grupos de hilos conoces que tengan un tamaño dinámico? E incluso si tienes un grupo de subprocesos de tamaño dinámico, en cambio, obtienes el problema de la sobresuscripción y la sobrecarga de cualquier heurística necesaria para realizar un seguimiento de cuándo agregar nuevos subprocesos y eliminar los antiguos. – ronag