Namespaces
Variants

std::packaged_task<R(Args...)>:: 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)
(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
packaged_task ( ) noexcept ;
(1) (自 C++11 起)
template < class F >
explicit packaged_task ( F && f ) ;
(2) (自 C++11 起)
template < class F, class Allocator >
explicit packaged_task ( std:: allocator_arg_t , const Allocator & a, F && f ) ;
(3) (自 C++11 起)
(直至 C++17)
packaged_task ( const packaged_task & ) = delete ;
(4) (自 C++11 起)
packaged_task ( packaged_task && rhs ) noexcept ;
(5) (自 C++11 起)

构造一个新的 std::packaged_task 对象。

1) 构造一个没有任务且无共享状态的 std::packaged_task 对象。
2,3) 构造一个 std::packaged_task 对象,其存储任务的类型为 std:: decay < F > :: type 并具有共享状态。存储的任务通过 std:: forward < F > ( f ) 进行初始化。

这些重载仅当 std:: decay < F > :: type std:: packaged_task < R ( Args... ) > 类型不同时才参与重载决议。

t1 , t2 , ..., tN Args 中对应类型的值,若 INVOKE<R> ( f, t1, t2, ..., tN ) 不是合法表达式,则程序非良构。

(C++20 前)

此重载仅当 std:: remove_cvref_t < F > std:: packaged_task < R ( Args... ) > 类型不同时才参与重载决议。

std:: is_invocable_r_v < R, std:: decay_t < F > & , Args... > false ,则程序非良构。

(C++20 起)
3) 分配器 a 用于分配存储任务所需的内存。
4) 复制构造函数被删除, std::packaged_task 仅支持移动操作。
5) 构造一个 std::packaged_task ,其共享状态和任务先前由 rhs 所拥有,使 rhs 不再具有共享状态且任务处于移出状态。

目录

参数

f - 要执行的可调用目标
a - 存储任务时使用的分配器
rhs - 要从中移动的 std::packaged_task

异常

2) f 的拷贝/移动构造函数抛出的任何异常,以及当内存分配失败时可能抛出的 std::bad_alloc
3) f 的拷贝/移动构造函数以及分配器的 allocate 函数在内存分配失败时抛出的任何异常。

示例

#include <future>
#include <iostream>
#include <thread>
int fib(int n)
{
    if (n < 3)
        return 1;
    else
        return fib(n - 1) + fib(n - 2);
}
int main()
{
    std::packaged_task<int(int)> fib_task(&fib); 
    std::cout << "Starting task\n";
    auto result = fib_task.get_future();
    std::thread t(std::move(fib_task), 42);
    std::cout << "Waiting for task to finish..." << std::endl;
    std::cout << result.get() << '\n';
    std::cout << "Task complete\n";
    t.join();
}

输出:

Starting task
Waiting for task to finish...
267914296
Task complete

缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的C++标准。

缺陷报告 适用标准 发布时行为 正确行为
LWG 2067 C++11 拷贝构造函数的参数类型为 packaged_task& 添加 const
LWG 2097 C++11 对于重载 (2,3) F 可能为 std::packaged_task<R(Args...)> F 进行约束
LWG 4154 C++11 重载 (2,3) 未考虑退化 考虑退化