1. std::future
future是类模板,future对象里面含有线程执行的结果,可以通过调用函数get()来获取结果。但是,get()函数的设计包含移动语义,即只能调用一次,第二次调用时会报异常。
#include<iostream>
#include<future>
using namespace std;
int myThread(int num)
{
cout << "Thread start id = " << this_thread::get_id() << endl;
chrono::milliseconds time(5000); //休息5秒
this_thread::sleep_for(time);
cout << "Thread end id = " << this_thread::get_id() << endl;
return num * 2;
}
int main()
{
cout << "Main start id = " << this_thread::get_id() << endl;
packaged_task<int(int)> package(myThread); //把函数myThread通过packaged_task包装起来。
thread thread(ref(package), 5);
thread.join(); //等待线程执行完毕
future<int> result = package.get_future(); //future对象里保存线程的执行结果
cout << "result = " << result.get() << endl;
cout << "result = " << result.get() << endl; //第二次调用get()函数,抛出异常
return 0;
}
执行结果
调试代码,监视future<int>对象。在语句result.get()执行前
执行后
如果想要多次调用get()函数,获取线程的返回值,请使用std::shared_future而不是std::future。
2. std::shared_future
shared_future也是类模板,其对象里含有线程执行的结果,可以通过函数get()来获取结果。get()函数的设计包含复制语义,可以多次调用。
int main()
{
cout << "Main start id = " << this_thread::get_id() << endl;
packaged_task<int(int)> package(myThread); //把函数myThread通过packaged_task包装起来。
thread thread(ref(package), 5);
thread.join(); //等待线程执行完毕
shared_future<int> result = package.get_future(); //shared_future对象里保存线程的执行结果
cout << "result = " << result.get() << endl;
cout << "result = " << result.get() << endl;
return 0;
}
执行结果