Класс packaged_task
Класс packaged_task из заголовочного файла <future>
представляет собой обертку для вызываемого объекта (функции,
лямбды или функтора), которая позволяет запускать этот объект
асинхронно и получать результат его выполнения через связанный
объект future. В первый параметр шаблона мы передаем
сигнатуру вызываемого объекта, например int(int, int).
В конструктор мы передаем сам вызываемый объект, а метод
get_future возвращает связанный future, через
который позже можно получить результат. Сам packaged_task
не запускает задачу - это делается вручную через оператор
operator или передачей в thread.
Синтаксис
#include <future>
std::packaged_task<ReturnType(ArgTypes...)> task(func);
std::future<ReturnType> fut = task.get_future();
Пример
Давайте создадим packaged_task, который складывает два
числа, и получим результат через связанный future:
#include <iostream>
#include <future>
using namespace std;
int add(int a, int b)
{
return a + b;
}
int main()
{
packaged_task<int(int, int)> task(add);
future<int> res = task.get_future();
task(2, 3);
cout << res.get() << endl;
return 0;
}
Результат выполнения кода:
5
Пример
Давайте передадим packaged_task в отдельный поток и
получим результат асинхронно через future:
#include <iostream>
#include <future>
#include <thread>
using namespace std;
int main()
{
packaged_task<int(int, int)> task([](int a, int b) {
return a * b;
});
future<int> res = task.get_future();
thread t(move(task), 4, 5);
t.join();
cout << res.get() << endl;
return 0;
}
Результат выполнения кода:
20