c++多线程(十五) - std::shared_future àì夳堔傛蜴生んèń 2022-02-09 11:11 279阅读 0赞 ### 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; } 执行结果 ![20190502191030116.png][] 调试代码,监视future<int>对象。在语句result.get()执行前 ![20190502190714897.png][] 执行后 ![20190502190843243.png][] 如果想要多次调用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; } 执行结果 ![20190502191618243.png][] [20190502191030116.png]: /images/20220206/18ff40cf7367411a99f557b53268348d.png [20190502190714897.png]: /images/20220206/c8732f8a64954b8090fb91b34df59a23.png [20190502190843243.png]: /images/20220206/32d1b3a4f4b744c68203906baf1cf93e.png [20190502191618243.png]: /images/20220206/5529285fdc9148b992b127e6a60eb1f3.png
还没有评论,来说两句吧...