代码之家(www.adminjie.com)精品网站源码,微信源码,游戏源码分享平台。《交流群:1037940574》
当前位置:网站首页 技术文章 网页制作 正文

C++多线程获取返回值方法详解

时间:2020-06-25 [网页制作]作者:admin 浏览:124 次

在许多时候,我们会有这样的需求——即我们想要得到线程返回的值。但是在C++11 多线程中我们注意到,std::thread对象会忽略顶层函数的返回值。

那问题来了,我们要怎么获得线程的返回值呢?

我们通过一个例子来说明如何实现这个需求。用多个线程计算(a+b)/ (x+y) 的值

有两种方法,分别是

1. 传统的方法:在线程间共享指针

#include<iostream>  #include<thread>  #include<mutex>  #include<atomic>  using namespace std;    void func2(int x, int y,int* ans) {    *ans= x + y;  }    int main()  {    //计算(a+b)/(x+y)    //用三个线程,一个线程计算a+b,另一个线程计算x+y    int a, b, x, y;    a = 10, b = 8, x = 2, y = 4;      int* sum1 = new int(0);    int* sum2 = new int(0);    thread t1(func2, a, b, sum1);    t1.join();    thread t2(func2, x, y, sum2);    t2.join();        cout << (*sum1) / (*sum2) << endl;      delete sum1;    delete sum2;        system("pause");    return 0;  }

2. C++11的方法:使用std::future和std::promise

std::future和std::promise是封装好的两个类模板,这两个类需要配合使用,他们的头文件是#include<future>

std::future,它表示存储着一个未来会被初始化的变量。这个变量可以通过std::future提供的成员函数std::future::get()来得到。如果在这个变量被赋值之前就有别的线程试图通过std::future::get()获取这个变量,那么这个线程将会被阻塞到这个变量可以获取为止。

std::promise同样也是一个类模板,这个对象承诺在未来一定会初始化一个变量(这个变量也就是std::future中的变量)。

每一个std::promise对象都有一个与之关联的std::future对象。当std::promise设置值的时候,这个值就会赋给std::future中的对象了。

#include<iostream>  #include<thread>  #include<mutex>  #include<atomic>  #include<future>  //std::future std::promise  #include<utility>  //std::ref模板传参的时候使用    void func2(int x, int y,std::promise<int> &promiseObj) {    promiseObj.set_value(x+y);  }    int main()  {    //计算(a+b)/(x+y)    //用三个线程,一个线程计算a+b,另一个线程计算x+y    int a, b, x, y;    a = 10, b = 8, x = 2, y = 4;      int sum1, sum2;    //声明一个类    std::promise<int> promiseObj;    //将future和promise关联    std::future<int> futureObj = promiseObj.get_future();    //模板传参的时候使用ref,否则传参失败    std::thread t1(func2, a, b, ref(promiseObj));    t1.join();    //获取值    sum1 = futureObj.get();    std::cout << "sum1=" << sum1 << std::endl;      //不能直接复用上面的future和promise    std::promise<int> promiseObj2;    std::future<int> futureObj2 = promiseObj2.get_future();      std::thread t2(func2, x, y, ref(promiseObj2));    t2.join();    sum2 = futureObj2.get();    std::cout << "sum2=" << sum2 << std::endl;      std::cout << "sum1/sum2=" << sum1 / sum2 << std::endl;        std::system("pause");    return 0;  }

C++多线程获取返回值方法详解

以上就是本文的全部内容,希望对大家的学习有所帮助


转载请注明来源:C++多线程获取返回值方法详解

本文永久链接地址:https://www.adminjie.com/post/2972.html

免责声明:
本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。

附:
二○○二年一月一日《计算机软件保护条例》第十七条规定:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬!鉴于此,也希望大家按此说明研究软件!

版权声明:
一、本站致力于为软件爱好者提供国内外软件开发技术和软件共享,着力为用户提供优资资源。
二、本站提供的部分源码下载文件为网络共享资源,请于下载后的24小时内删除。如需体验更多乐趣,还请支持正版。
三、我站提供用户下载的所有内容均转自互联网。如有内容侵犯您的版权或其他利益的,若有侵犯你的权益请:点此维权 站长会进行审查之后,情况属实的会在三个工作日内为您删除。

  • 代码之家会员升级
  • 最新文章
  • 阿里云大优惠
  • 热门文章