Spec-Zone.ru › C++

std::packaged_task

Определено в заголовке <future>
template< class > class packaged_task; //not defined
(1) (с C++11)
template< class R, class ...ArgTypes > 
class packaged_task<R(ArgTypes...)>;
(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++.

DR Применено к Поведение, как опубликовано Корректное поведение
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/w/cpp/thread/packaged_task

Spec-Zone.ru

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