std::packaged_task::make_ready_at_thread_exit
De cppreference.com
void make_ready_at_thread_exit( ArgTypes... args ); |
(desde C++11) | |
Llama a la tarea almacenada con args reenviados como argumentos. El valor de retorno de la tarea o cualquier excepción lanzada por ella se almacena en el estado compartido de *this.
El estado compartido solo queda listo después de que el hilo actual termina y todos los objetos de duración de almacenamiento local al hilo se destruyen.
Parámetros
| args | - | Los parámetros a pasar cuando se invoque la tarea almacenada. |
Valor de retorno
(Ninguno)
Excepciones
std::future_error en las siguientes condiciones de error:
- La tarea almacenada ya se ha invocado. La categoría de error se establece a promise_already_satisfied.
*thisno tiene un estado compartido. La categoría de error se establece a no_state.
Ejemplo
Ejecuta este código
#include <future>
#include <iostream>
#include <chrono>
#include <thread>
#include <functional>
#include <utility>
void obrero(std::future<void>& salida)
{
std::packaged_task<void(bool&)> mi_tarea{ [](bool& listo) { listo=true; } };
auto resultado = mi_tarea.get_future();
bool listo = false;
mi_tarea.make_ready_at_thread_exit(listo); // ejecuta la tarea de inmediato
std::cout << "obrero: listo = " << std::boolalpha << listo << std::endl;
auto estatus = resultado.wait_for(std::chrono::seconds(0));
if (estatus == std::future_status::timeout)
std::cout << "obrero: resultado todavía no está listo" << std::endl;
salida = std::move(resultado);
}
int main()
{
std::future<void> resultado;
std::thread{obrero, std::ref(resultado)}.join();
auto estatus = resultado.wait_for(std::chrono::seconds(0));
if (estatus == std::future_status::ready)
std::cout << "main: resultado está listo" << std::endl;
}
Salida:
obrero: listo = true
obrero: resultado todavía no está listo
main: resultado está listo
Véase también
| Ejecuta la función. (función miembro pública) |