std::packaged_task
De cppreference.com
Definido en el archivo de encabezado <future> | ||
template<class>class packaged_task;// sin definir | (1) | (desde C++11) |
template<class R, class ...ArgTypes> class packaged_task<R(ArgTypes...)>; | (2) | (desde C++11) |
La plantilla de clase std::packaged_task
envuelve o "empaqueta" cualquier objeto invocable (Callable), ya sea una función, expresión lambda, expresión de vinculación u otro objeto función, para que pueda invocarse de forma asincrónica. Su valor de retorno o excepción lanzada se almacena en un estado compartido al que se puede acceder a través de objetos std::future.
Al igual que std::function, | (hasta C++17) |
Contenido |
[editar]Funciones miembro
Construye el objeto tarea. (función miembro pública) | |
Destruye el objeto tarea. (función miembro pública) | |
Mueve el objeto tarea. (función miembro pública) | |
Comprueba si el objeto de la tarea tiene una función válida Original: checks if the task object has a valid function The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (función miembro pública) | |
Intercambia dos objetos tarea. (función miembro pública) | |
Obtener el resultado | |
Devuelve un objeto std::future asociado con el resultado prometido. (función miembro pública) | |
Ejecución | |
Ejecuta la función. (función miembro pública) | |
Ejecuta la función asegurándose de que el resultado esté listo solo una vez que el hilo actual termine. (función miembro pública) | |
Restablece el estado abandonando cualquier resultado almacenado de ejecuciones anteriores. (función miembro pública) |
[editar]Funciones no miembro
Especializa al algoritmo std::swap. (plantilla de función) |
[editar]Clases auxiliares
Especializa al rasgo de tipo std::uses_allocator (especialización de plantilla de clase) |
[editar]Guías de deducción(desde C++17)
[editar]Ejemplo
Ejecuta este código
#include <iostream>#include <cmath>#include <thread>#include <future>#include <functional> // función única para evitar eliminar la ambigüedad del conjunto de sobrecarga de std::powint f(int x, int y){returnstd::pow(x,y);} void tarea_lambda(){ std::packaged_task<int(int,int)> task([](int a, int b){returnstd::pow(a, b);});std::future<int> result = task.get_future(); task(2, 9); std::cout<<"tarea_lambda:\t"<< result.get()<<'\n';} void tarea_bind(){ std::packaged_task<int()> task(std::bind(f, 2, 11));std::future<int> result = task.get_future(); task(); std::cout<<"tarea_bind:\t"<< result.get()<<'\n';} void tarea_hilo(){ std::packaged_task<int(int,int)> task(f);std::future<int> result = task.get_future(); std::thread tarea_td(std::move(task), 2, 10); tarea_td.join(); std::cout<<"tarea_hilo:\t"<< result.get()<<'\n';} int main(){ tarea_lambda(); tarea_bind(); tarea_hilo();}
Salida:
tarea_lambda: 512 tarea_bind: 2048 tarea_hilo: 1024
[editar]Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
---|---|---|---|
LWG 3117 | C++17 | Faltaban las guías de deducción para packaged_task . | Se añadieron. |
[editar]Véase también
(C++11) | Espera a un valor que se establece asíncronamente. (plantilla de clase) |