C++11异步操作的4个接口
future :: 异步执行任务后,future 获取结果
async :: 异步运行一个函数 可以通过 future 获取结果
packaged_task :: 可以封装一个函数,把它放进线程池里,如何异步执行通过 future 获取结果
promise :: 1,可以在异步线程之间 设定值 2,在函数内设定值后 可以使用 future 获取
future 与 promise
1,设定参数,然后 future 获取(可以在多线程中设定值,然后 future 返回)
void task(int a, int b, std::promise<int> &&ret)
{
int tempa = a * 2;
int tempb = b * 3;
ret.set_value(tempa + tempb);
}
int main()
{
std::promise<int> promise; // 注意类型:
std::future<int> result = promise.get_future(); // 绑定future
std::thread t(task, 1, 2, std::move(promise));
cout << "res=" << result.get() << endl;
t.join();
return 0;
}
future 与 async
有没有一种办法,可以让上面的代码更加简便
使用 async 异步运行函数,用 future 获取结果,这样我们就不用创建线程,再 join 线程了
int task(int a, int b)
{
int tempa = a * 2;
int tempb = b * 3;
return tempa + tempb;//用future获取结果
}
int main()
{
std::future<int> f = std::async(task, 1, 2);//异步运行
cout << f.get() << endl;
return 0;
}
future 与 packaged_task
int task(int a, int b)
{
int tempa = a * 2;
int tempb = b * 3;
return tempa + tempb;//也是通过 future 获取
}
int main()
{
std::packaged_task<int(int, int)> pt(task);//投入线程池,异步执行任务
auto res = pt.get_future();
pt(1, 2);//执行函数
cout << "res=" << res.get() << endl;
return 0;
}
使用:packaged_task <返回值(函数参数,函数参数)> 对象名