본문 바로가기

Programming/CPP11&14

[C++11] thread 지원 - future를 통한 return값 획득 (2)

반응형


2015/06/27 - [Programming/C++11&14] - [C++11] thread 지원 (1)

C++11의 thread에서 return으로 결과를 받는 방법입니다.

결과를 받는 방법은 약간 복잡할 수 있습니다.

먼저 std::promise라는 클래스 템플릿이 추가되었습니다.

<future> 헤더에 추가되어 있습니다.

promise는 값이나 예외를 저장할 수 있는 기능을 가지고 있습니다.

그리고 promise 객체를 통해서 생성되는 std::future를 통해서 나중에 결과를 얻을 수 있습니다.

기본적인 코드는 다음과 같습니다.

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

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

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

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

	return 0;
}

일단 promise<int> 타입의 객체를 선언합니다.

템플릿 안의 타입이 실제 return할 타입이 됩니다.

thread 함수 역시 이 타입의 RValue 참조 형태의 인자를 받는 형식으로 작성합니다.

그리고 promise의 get_future() 함수를 통해서 future를 생성합니다.

future를 통해서 전달된 결과나 예외를 확인할 수 있습니다.

그리고 std::move()로 p(promise<int> 객체)를 전달합니다.

함수 내부에서는 결과값을 반환할 때 set_value()를 통해서 값을 설정하면 됩니다.

thread가 완전히 종료된 이후에 future 객체의 get()을 호출하면 값을 얻을 수 있습니다.

이 방법 외에 C++11에는 future와 thread의 상위 레벨인 async를 통해서 구현이 가능합니다.

다음과 같은 방법으로 구현이 가능합니다.

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

#include <chrono>
int ThreadFunc()
{
	std::this_thread::sleep_for(std::chrono::seconds(3));

	return 1;
}

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

	return 0;
}

thread 함수에 임의적으로 3초의 딜레이를 추가했습니다.

std::async를 사용해서 일반적인 형태의 return을 받는 구조가 되었습니다.

다만 실행해보면 결과값이 3초 이후, thread 함수가 종료된 이후 출력이 됩니다.

완전한 비동기로 동작하기를 원하면 std::thread를 사용해서 코드를 작성하면 됩니다.

thread 동기화에 대한 내용은 아래의 링크에서 확인할 수 있습니다.

2015/06/29 - [Programming/C++11&14] - [C++11] std::mutex를 통한 thread 동기화

반응형