c++ c++11 promise future

c++ - Futuros vs. promesas



c++11 promise (1)

Futuro y Promesa son los dos lados separados de una operación asincrónica.

std::promise es utilizado por el "productor / escritor" de la operación asincrónica.

std::future es utilizado por el "consumidor / lector" de la operación asincrónica.

La razón por la que está separado en estas dos "interfaces" separadas es para ocultar la funcionalidad "escribir / configurar" del "consumidor / lector".

auto promise = std::promise<std::string>(); auto producer = std::thread([&] { promise.set_value("Hello World"); }); auto future = promise.get_future(); auto consumer = std::thread([&] { std::cout << future.get(); }); producer.join(); consumer.join();

Una forma (incompleta) de implementar std :: async usando std :: promise podría ser:

template<typename F> auto async(F&& func) -> std::future<decltype(func())> { typedef decltype(func()) result_type; auto promise = std::promise<result_type>(); auto future = promise.get_future(); std::thread(std::bind([=](std::promise<result_type>& promise) { try { promise.set_value(func()); // Note: Will not work with std::promise<void>. Needs some meta-template programming which is out of scope for this question. } catch(...) { promise.set_exception(std::current_exception()); } }, std::move(promise))).detach(); return std::move(future); }

Al usar std::packaged_task que es un helper (es decir, básicamente hace lo que estábamos haciendo arriba) en std::promise , puede hacer lo siguiente, que es más completo y posiblemente más rápido:

template<typename F> auto async(F&& func) -> std::future<decltype(func())> { auto task = std::packaged_task<decltype(func())()>(std::forward<F>(func)); auto future = task.get_future(); std::thread(std::move(task)).detach(); return std::move(future); }

Tenga en cuenta que esto es ligeramente diferente de std::async donde el std::future devuelto se bloqueará cuando se destruya hasta que el hilo termine.

Me estoy confundiendo con la diferencia entre un futuro y una promesa.

Obviamente, tienen diferentes métodos y otras cosas, pero ¿cuál es el caso de uso real?

¿Lo es?:

  • cuando administro una tarea asíncrona, uso el futuro para obtener el valor "en el futuro"
  • cuando soy la tarea asincrónica, utilizo la promesa como el tipo de devolución para permitir que el usuario obtenga un futuro de mi promesa