目錄
1、packaged_task
packaged_task<> 被用來同時存有目標函數及其“成果”。(不理解,請看測試代碼)
2、packaged_task的函數
packaged_task pt; 建立一個不帶shared state的對象
packaged_task pt(f); 爲task f建立一個對象
packaged_task pt(alloc,f); 爲task f建立一個對象,使用分配器
packaged_task pt(rv); Move構造函數
pt = rv; Move assignment
swap(pt1,pt2); 兩個任務交換
pt1.swap(pt2); 兩個任務交換
pt.valid(); 如果pt有個shared state狀態就產生true
pt.get_future(); 產生一個future object,用來取回shared state
pt(args); 調用task並令shared state成爲ready
pt.make_ready_at_thread_exit(args); 調用task,並且在線程退出時令shared state成爲ready
pt.reset(); 爲pt建立一個新的shared state
pt.~Packaged_task(); 銷燬*this
3、測試代碼
#include <iostream>
#include <thread>
#include <future>
using namespace std;
int threadFun(int sum)
{
cout << this_thread::get_id() << endl;
return sum;
}
int main()
{
//建立任務
packaged_task<int(int)> task1; //建立一個不帶shared state的對象
packaged_task<int(int)> task2(threadFun);//爲task2 f建立一個對象
packaged_task<int(int)> task3(move(task2));//Move構造函數
task1 = move(task3);//Move assignment
//判斷是否有個shared state
cout << boolalpha << task1.valid() << endl;
//獲取任務返回值
future<int> future1 = task1.get_future();
//開啓任務,與建立任務時的函數int(int)格式同步
task1(1);
//調用task,並且在線程退出時令shared state成爲ready(有bug)
//task1.make_ready_at_thread_exit(1);
//打印結果
cout << future1.get() <<endl;
//task1.~packaged_task();//銷燬*this bug
system("pause");
}