Program Language/C & C++

[C++] thread에서 return 값 받기 (promise/future)

야곰야곰+책벌레 2021. 9. 30. 13:42
728x90
반응형

C++11 이후에는 <future> 이 추가되었으며 future, promise를 통해서 값이나 예외를 저장할 수 있다.

생성하려는 Thread에 Promise를 매개변수로 전달해서 받아올 수 있다.

미래에(future) thread가 원하는 데이터를 돌려 주겠다고 약속(promise)하는 것이라고 할 수 있다.

#include <thread>
#include <future>
#include <iostream>

#include <chrono>

void ThreadFunc(std::promise<int>& retVal)
{
	retVal.set_value(1);
}

int main()
{
	std::promise<int> p;
	std::future<int> f = p.get_future();

	std::thread th1(ThreadFunc, std::ref(p));
	th1.join();

	std::cout << f.get() << std::endl;

	return 0;
}

promise를 선언할 때 템플릿 안에 타입을 바꿔서 사용할 수 있다.

promise <int> 대신에 promise <double>로 바꾸면 실수를 받아올 수 있다. 

같은 형으로 future<int>도 future <double>로 바꿔줘야 한다.

promise 생성 → future 생성 → 객체 전달 → 함수내 반환 → 결과 값 확인

의 순서가 된다.

thread가 완전히 종료되면 future의 객체의 get()을 호출하여 값을 얻을 수 있다.

 

다른 방법으로는 thread 함수의 return을 사용할 수 있다.

#include <thread>
#include <future>
#include <iostream>

#include <chrono>

int ThreadFunc()
{
	std::this_thread::sleep_for(std::chrono::seconds(3));

	return 5; // 이 부분을 값으로 취한다.
}

int main()
{
	std::future<int> f = std::async(ThreadFunc);
	std::cout << f.get() << std::endl;

	return 0;
}

위와 다르게 promise를 사용하지 않고, thread의 return 값을 async로 직접 받아서 사용할 수 있다.

예제에서 3초 대기를 주었는데, 실행 시 3초 후 return 된 값이 표시됨을 볼 수 있다.

728x90
반응형