std:: packaged_task
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Getting the result | ||||
| Execution | ||||
| Non-member functions | ||||
| Helper classes | ||||
|
(until C++17)
|
||||
| Deduction guides (C++17) |
|
Определено в заголовочном файле
<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
,
|
(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) |
|
Функции, не являющиеся членами класса
|
(C++11)
|
специализирует алгоритм
std::swap
(шаблон функции) |
Вспомогательные классы
|
(C++11)
(до C++17)
|
специализирует
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)
|
ожидает значение, которое устанавливается асинхронно
(шаблон класса) |