std::packaged_task
De cppreference.com
<tbody>
</tbody>
| 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) |
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) | |
Funciones no miembro
| Especializa al algoritmo std::swap. (plantilla de función) |
Clases auxiliares
| Especializa al rasgo de tipo std::uses_allocator (especialización de plantilla de clase) |
Guías de deducción(desde C++17)
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::pow
int f(int x, int y) { return std::pow(x,y); }
void tarea_lambda()
{
std::packaged_task<int(int,int)> task([](int a, int b) {
return std::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
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. |
Véase también
(C++11) |
Espera a un valor que se establece asíncronamente. (plantilla de clase) |