一 简介
C++11中的std::packaged_task是个模板类。因此我们需要将模板参数传递给packaged_task<>,即可调用函数的类型。同时std::packaged_task<>可移动,但是不可复制,所以我们需要将它传递给线程。
std::packaged_task对象内部包含两个元素:
- 存储的任务(函数)是一些可调用的对象。
- 共享状态(future),它可以存储调用存储的任的结果,并可以通过get_future获取去进行异步访问
二例子
方法
get_future:返回一个与packaged_task对象的共享状态关联的std::future对象
#include <iostream>
#include <thread>
#include <future>
#include <string>
//从DB获取数据
std::string getData(std::string str)
{
//获取数据
std::this_thread::sleep_for(seconds(5));
return "Q是德华";
}
int main()
{
//lamda
创建封装回调函数的packaged_task<>
//std::packaged_task<std::string(std::string)> task([](std::string)->std::string {
// //获取数据
// std::this_thread::sleep_for(seconds(5));
// return "Q是德华";
//
//});
//创建封装回调函数的packaged_task<>
std::packaged_task<std::string(std::string)> task(getData);
//从packaged_task<>获取相关的future<>
std::future<std::string> result = task.get_future();
//将packaged_task传递给线程以异步运行
//std::packaged_task<>可移动,但是不可复制,所以我们需要将它传递给线程
//它只是个任务,不会自己执行,需要启动
std::thread th(std::move(task), "...");
//获取packaged_task<>的结果,即getData()的返回值
std::string data = result.get();//线程不需要阻塞,get自己会阻塞的
std::cout << data << std::endl;
system("pause");
return 0;
}
结果