58 C++ 解决future只能取得一次结果的问题。--shared_future解决方案。
一 前提:future.get()方法只能获得一次
前面我们学习了使用async 启动异步任务,返回值使用 future<T> 获取的方案。
前面我们也学习了使用 promise<T> pro, 然后通过 pro.setvalue(tempvalue),最后通过 pro.getfuture()得到future。
然后呢,我们就可以通过future.get()去获得里面存储的数据。
但是这个future.get()只能获取一次,原理是内部实现是通过move来实现的。
假设我们的需求是需要获取多次,应该怎么做呢?
C++提供了shared_future
二 shared_future
1.方案一 , async 线程启动后,结果通过 shared_future直接接受。
2.方案二,async 线程启动后,结果通过 future接受后,转化成 shared_future。
//该方法,返回值是double,参数是string,在函数内部可以给一个 int赋值。赋值后的数据可以通过 resultint的实参.getfuture()获得
double promisefunc180(promise<int> &resultint, string strsource) {
cout << "promisefunc180 start " << endl;
// 计算完毕后,我们假设计算结果是1000,给resultint赋值
resultint.set_value(1000);
cout << "promisefunc180 end " << endl;
return 3.14;
}
//
void main(){
//方案一,async 线程启动后,结果通过 shared_future直接接受。
string str3 = "chinabank";
promise<int> promi3;
//注意,这里ayync的返回值是线程入口启动函数的返回值是double,
//promi3.get_future()的返回值是线程中想要赋值的数据的返回值
shared_future<double> fu6 = async(launch::async, promisefunc180, ref(promi3), ref(str3));
shared_future<int> fu7 = promi3.get_future();
cout << fu6.get() << endl;;
cout << fu6.get() << endl;;
cout << fu6.get() << endl;;
cout << fu6.get() << endl;;
cout << fu7.get() << endl;;
cout << fu7.get() << endl;;
cout << fu7.get() << endl;;
cout << fu7.get() << endl;;
cout << " 0000000000000 "<<endl;
//方案二,async 线程启动后,结果通过 future接受后,转化成 shared_future。
//promi3只能使用一次,C++11 文档明确有说明,下面不要复用,否则有runtime exception
string str4 = "chinabank";
promise<int> promi4;
//future<double> fu8 = async(launch::async, promisefunc180, ref(promi3), ref(str4));//runtime exception
future<double> fu8 = async(launch::async, promisefunc180, ref(promi4), ref(str4));//runtime exception
shared_future<double> fu9(move(fu8));
cout << fu9.get() << endl;;
cout << fu9.get() << endl;;
cout << fu9.get() << endl;;
cout << fu9.get() << endl;;
}
原文地址:https://blog.csdn.net/hunandede/article/details/135713761
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!