c++多线程(十五) - std::shared_future

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;
}

    执行结果

猜你喜欢

转载自blog.csdn.net/liyazhen2011/article/details/89763841