Namespaces
Variants

std:: packaged_task

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
packaged_task
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
Определено в заголовочном файле <future>
template < class >
class packaged_task ;
(1) (начиная с C++11)
(не определено)
template < class R, class ... ArgTypes >
class packaged_task < R ( ArgTypes... ) > ;
(2) (начиная с C++11)

Шаблон класса std::packaged_task оборачивает любой Callable объект (функцию, лямбда-выражение, bind-выражение или другой функциональный объект) для возможности его асинхронного вызова. Его возвращаемое значение или сгенерированное исключение сохраняется в общем состоянии, доступ к которому может быть получен через объекты std::future .

Так же как и std::function , std::packaged_task является полиморфным контейнером с поддержкой аллокаторов: сохранённый вызываемый объект может быть размещён в куче или с использованием предоставленного аллокатора.

(until C++17)

Содержание

Функции-члены

создает объект задачи
(public member function)
уничтожает объект задачи
(public member function)
перемещает объект задачи
(public member function)
проверяет, имеет ли объект задачи допустимую функцию
(public member function)
обменивает два объекта задачи
(public member function)
Получение результата
возвращает std::future связанный с обещанным результатом
(public member function)
Выполнение
выполняет функцию
(public member function)
выполняет функцию, гарантируя, что результат будет готов только после выхода текущего потока
(public member function)
сбрасывает состояние, отбрасывая любые сохраненные результаты предыдущих выполнений
(public member function)

Функции, не являющиеся членами класса

специализирует алгоритм std::swap
(шаблон функции)

Вспомогательные классы

специализирует std::uses_allocator type trait
(специализация шаблона класса)

Руководства по выводу (начиная с C++17)

Пример

#include <cmath>
#include <functional>
#include <future>
#include <iostream>
#include <thread>
// уникальная функция для устранения неоднозначности перегруженного std::pow
int f(int x, int y) { return std::pow(x, y); }
void task_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 << "task_lambda:\t" << result.get() << '\n';
}
void task_bind()
{
    std::packaged_task<int()> task(std::bind(f, 2, 11));
    std::future<int> result = task.get_future();
    task();
    std::cout << "task_bind:\t" << result.get() << '\n';
}
void task_thread()
{
    std::packaged_task<int(int, int)> task(f);
    std::future<int> result = task.get_future();
    std::thread task_td(std::move(task), 2, 10);
    task_td.join();
    std::cout << "task_thread:\t" << result.get() << '\n';
}
int main()
{
    task_lambda();
    task_bind();
    task_thread();
}

Вывод:

task_lambda: 512
task_bind:   2048
task_thread: 1024

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 3117 C++17 deduction guides for packaged_task were missing added

Смотрите также

(C++11)
ожидает значение, которое устанавливается асинхронно
(шаблон класса)