Spec-Zone.ru › C++

std::packaged_task

Определён в заголовочном файле <future>
template< class >
class packaged_task;
(1) (начиная с C++11)
(не определено)
template< class R, class ...Args > 
class packaged_task<R(Args...)>;
(2) (начиная с C++11)

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

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

(до C++17)

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

(конструктор)
создаёт объект задачи
(открытая функция-член)
(деструктор)
уничтожает объект задачи
(открытая функция-член)
operator=
перемещает объект задачи
(открытая функция-член)
valid
проверяет, содержит ли объект задачи допустимую функцию
(открытая функция-член)
swap
меняет местами два объекта задачи
(открытая функция-член)
Получение результата
get_future
возвращает std::future, связанный с обещанным результатом
(открытая функция-член)
Выполнение
operator()
выполняет функцию
(открытая функция-член)
make_ready_at_thread_exit
выполняет функцию, гарантируя, что результат будет готов только после завершения текущего потока
(открытая функция-член)
reset
сбрасывает состояние, отказываясь от любых результатов предыдущих выполнений
(открытая функция-член)

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

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

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

std::uses_allocator<std::packaged_task>
(C++11) (до C++17)
специализирует характеристику типа std::uses_allocator
(специализация шаблона класса)

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

Пример

#include <cmath>
#include <functional>
#include <future>
#include <iostream>
#include <thread>

// unique function to avoid disambiguating the std::pow overload set
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++.

Отчёт об ошибке Применён к Опубликованное поведение Исправленное поведение
LWG 3117 C++17 руководства по выводу типов для packaged_task отсутствовали добавлены

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/thread/packaged_task

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API