This repository was archived by the owner on Apr 25, 2025. It is now read-only.
-
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는 이러한 여러 스레드가 결과를 주고 받는 과정에서 어긋나는(예외) 상황에 대처하기 위한 예외 처리 환경을 제공하기도 합니다. 위 링크에 자세한 예제도 있으니 참고하시기 바랍니다.