C++11 Future와 Async
20 Aug 2017 | C++ ThreadThread의 결과값 획득하는 방법
std::future와 std::promise를 이용하면 다른 Thread의 결과값을 쉽게 획득할 수 있습니다.
Thread에서 연산을 완료한 후 그 결과값은 promise에 저장합니다. 이후, future를 이용해서
그 값을 획득할 수 있습니다.
Thread 결과값은 다음과 같은 코드를 이용해서 획득가능합니다. Thread의 결과값을 받을 때까지
get() 부분은 Blocking 되어 대기합니다.
future<T> fut = ...; T res = fut.get();
promise의 사용은 다음과 같이 할 수 있습니다.
promise prom = ...; T val = ...; prom.set_value(val);
async 함수
async 함수를 사용하면 특정 함수 등을 Thread로 구동시키고 그 결과를 리턴받을 수 있습니다.
다음과 같은 예제 코드를 살펴보면,
#include <cstdio>
#include <future>
using namespace std;
int fun() {
for (int i = 1; i <= 10; i++) {
printf("fun[%d]\n", i);
}
return 200;
}
int main() {
//auto fut = async(fun);
auto fut = async(launch::async, fun);
//auto fut = async(launch::deferred, fun);
for (int i = 1; i <= 10; i++) {
printf("main[%d]\t", i);
}
printf("\n");
int result = fut.get();
printf("result : %d\n", result);
return 0;
}
async를 통해 실행한 결과값을 get() 함수를 이용해서 돌려받을 수 있는 것을 확인할 수 있습니다.
위 예제에서 async 호출하는 부분을 3가지 예시로 들었는데, 만약
auto fut = async(launch::async, fun);
으로 수행하면, 함수 fun()은 즉시 실행이 되고 그 결과는 future에 저장이 됩니다.
(실행해보면 메인 Thread와 별도 Thread가 동시에 돌아가는 것을 확인할 수 있습니다.)
만약, async 부분을 다음과 같이 호출한 경우는
auto fut = async(fun); // 또는 auto fut = async(launch::deferred, fun);
fun() 함수는 바로 실행되는 것이 아니라 ‘int result = fut.get()’ 코드가 실행될 때
fun() 함수가 실행되는 것을 확인할 수 있습니다.