-
Notifications
You must be signed in to change notification settings - Fork 2
2014 10 28 async, packaged_task, promise
krikit edited this page Nov 26, 2014
·
1 revision
async는 어떠한 작업을 asynchronous하게 병렬로 시작하고 메인 스레드에서는 다른 작업을 수행한 다음 나중에 결과를 받고자 할 때 사용합니다. 말로 설명하면 잘 감이 안오실텐데 코드를 보시죠.
int foo(double, char, bool); // asynchronous하게 병렬로 수행할 작업(함수)
std::future<int> fut = std::async(foo, 1.5, 'x', false); // foo() 작업 시작
// foo() 함수는 병렬로 수행되고 결과를 기다리는 동안 다른 작업을 수행
int res = fut.get(); // foo() 작업이 완료되면 결과를 받아 옴
이렇게 하는 이유는 foo() 함수가 네트워크 IO를 하는 경우 foo() 함수의 결과를 기다리느라 메인 스레드가 오랫동안 대기하는 대신 다른 작업을 수행하여 블럭킹 시간을 최대한 줄이고 수행 효율을 높이기 위함입니다.
packaged_task는 이러한 async 함수에 대해 좀더 저수준으로, 그리고 명시적으로 thread 클래스를 이용하여 구현할 때 사용합니다. 아래 코드를 보시죠.
std::packaged_task<int(double, char, bool)> tsk(foo);
auto fut = tsk.get_future(); // std::future<int> 타입
std::thread thr(std::move(tsk), 1.5, 'x', false); // 스레드 실행
// 다른 작업을 병렬로 수행
auto res = fut.get(); // int 타입
promise를 이용한 packaged_task가 내부적으로 어떻게 구현되는 지에 대한 핵심 개념은 다음 링크를 통해 보시기 바랍니다. (사실은 저도 잘.. ^^)
http://stackoverflow.com/questions/11004273/what-is-stdpromise
또한 스레드 간에 발생한 예외는 처리하기가 쉽지 않습니다. promise는 이러한 여러 스레드가 결과를 주고 받는 과정에서 어긋나는(예외) 상황에 대처하기 위한 예외 처리 환경을 제공하기도 합니다. 위 링크에 자세한 예제도 있으니 참고하시기 바랍니다.