will tiempos tiempo simple perfecto perfect ingles going futuros futuro continuo c++ multithreading c++11 mutex

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.

  1. future objeto future podría ser consultado solo una vez para el get() .
  2. 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 .