名稱空間
變體
操作

std::packaged_task<R(Args...)>::packaged_task

來自 cppreference.com
 
 
併發支援庫
執行緒
(C++11)
(C++20)
this_thread 名稱空間
(C++11)
(C++11)
(C++11)
協同取消
互斥
(C++11)
通用鎖管理
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
條件變數
(C++11)
訊號量
門閂和屏障
(C++20)
(C++20)
期值
(C++11)
(C++11)
(C++11)
(C++11)
安全回收
(C++26)
危險指標
原子型別
(C++11)
(C++20)
原子型別的初始化
(C++11)(C++20 中已棄用)
(C++11)(C++20 中已棄用)
記憶體排序
(C++11)(C++26 中已棄用)
原子操作的自由函式
原子標誌的自由函式
 
 
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>::typestd::packaged_task<R(Args...)> 不是相同型別時才參與過載決議。

t1, t2, ..., tNArgs 中相應型別的值,如果 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) 未考慮衰變 考慮衰變