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.
-
futureobjetofuturepodría ser consultado solo una vez para elget(). -
shared_futurese 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 .