C++다 중 스 레 드 반환 값 가 져 오 는 방법 에 대한 자세 한 설명

많은 경우 에 우 리 는 이러한 수요 가 있 을 것 이다.즉,우 리 는 스 레 드 가 되 돌아 오 는 값 을 얻 고 싶다 는 것 이다.그러나 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입 니 다.
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;
}

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기