总结:
1、利用std::packaged_task包装的可调用对象,在异步执行后可通过std::future获取返回值。
一、作用:
1、是一个模板类,std::packaged_task包装任何可调用目标(函数、lambda表达式、bind表达式、函数对象)以便它可以被异步调用。
2、std::packaged_task
类似于std::function
,它的返回值或抛出的异常被自动存储于能通过std::future对象访问的共享状态中。
二、介绍:
std::packaged_task
对象内部包含两个元素:
1、存储的任务(stored task)是一些可调用对象。
2、共享状态,它可以存储调用存储的任务(stored task)的结果,并通过std::future进行异步访问。
3、std::packaged_task不会自己启动,你必须调用它。
三、用法:
1、构造函数
template <class Fn> explicit packaged_task (Fn&& fn);
Fn
为可调用对象,如:
std::packaged_task<int(int)> bar ([](int x){return x*2;});
2、std::packaged_task::get_future()
调用std::packaged_task
的get_future
成员函数返回std::future
对象,其与共享状态关联。调用后std::packaged_task与std::future共享相同的共享状态:
(1) std::packaged_task对象是异步提供程序(asynchronous provider),应通过调用存储的任务(stored task)在某个时刻将共享状态设置为就绪。
(2) std::future对象是一个异步返回对象,可以检索共享状态的值,并在必要时等待其准备就绪。
3、std::packaged_task::operator()
调用存储的任务。
4、std::packaged_task::reset()
在保持相同存储的任务的同时,以新的共享状态重置对象。
四、案例:
具体见————参考资料一
std::packaged_task<int()> task(std::bind([](int x, int y) { return std::pow(x, y); }, 2, 11)); // 绑定函数与入参形成仿函数
std::future<int> result = task.get_future(); // 获取返回结果所在的future
std::thread task_td(std::move(task)); // 启动线程运行函数
task_td.join(); // 等待线程运行结束
std::cout << "task_thread:\t" << result.get() << '\n'; // 获取结果
五、参考资料:
1、 C++11中std::packaged_task的使用
2、 CPP