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 동기화
'Programming > CPP11&14' 카테고리의 다른 글
[C++11] Storage class specifiers에 thread_local 추가 (0) | 2015.07.07 |
---|---|
[C++11] std::mutex를 통한 thread 동기화 (0) | 2015.06.29 |
[C++11] thread 지원 (1) (0) | 2015.06.27 |
[C++11] 새로워진 random number 생성 (0) | 2015.05.22 |
[C++11] std::pair를 확장한 std::tuple (0) | 2015.05.17 |