c++ - tiempos - ¿Cuál es la diferencia entre futuro y futuro compartido?
tiempo futuro en ingles (1)
¿Cuál es la diferencia entre future
y future
shared_future
?
¿En qué casos debemos usar el shared_future
lugar del future
?
Estaba intentando encontrar una buena documentación que contrastara estas dos características de C ++ 11, y no pude encontrar una respuesta (fácil / legible al menos) en la web.
Este es mi entendimiento actual de las diferencias.
-
future
objetofuture
podría ser consultado solo una vez para elget()
. -
shared_future
se puede consultar cualquier número de veces.
caso de uso: si varios subprocesos dependen del resultado de una tarea asíncrona, entonces debemos usar shared_future
. Si el objeto futuro necesita ser consultado varias veces en el mismo subproceso, entonces debemos usar shared_future
en shared_future
lugar.
Más información, errores o pautas generales son bienvenidos ...
La motivación para estos dos tipos futuros se remonta a mover la semántica, los tipos de solo movimiento y la nueva característica de C ++ 11 para devolver los tipos de solo movimiento de las funciones ordinarias.
En C ++ 98/03, si desea devolver un tipo de una función de fábrica:
A
make_A()
{
A a;
// ...
return a;
}
entonces A
tenía que ser CopyConstructible
. Entonces, completamente nuevo en C ++ 11, podemos devolver A
incluso si no es CopyConstructible
, solo necesita ser MoveConstructible
.
Pero, ¿qué sucede si intenta ejecutar make_A
la vez, por ejemplo, utilizando futuros? ¿No sería un crimen si solo make_A
paralelizar make_A
si A
es CopyConstructible
? ¡Tendrías que renunciar a una optimización mientras persigues a otra!
Así que el future<R>
solo requiere que R
sea MoveConstructible
. Pero solo puede obtenerlo una vez, porque se está moviendo desde el resultado almacenado.
Pero obtener el mismo resultado para múltiples hilos también es una necesidad real. Así que shared_future<R>
permite eso, pero requiere que R
sea CopyConstructible
.