Future Channel

future는 나중에 준비될 결과와 예외를 담습니다

비동기 작업은 결과를 바로 반환하지 않고 std::future 핸들을 통해 대기, 조회, 예외 전달을 처리합니다.

실행 정책std::launch::async는 즉시 별도 실행, deferredget() 때 실행됩니다.
블로킹 지점get()은 결과가 준비될 때까지 기다리고, 한 번 호출하면 future의 값은 소비됩니다.
async

함수 실행과 future 생성을 맡깁니다

스레드 생성과 결과 전달을 직접 엮지 않아도 되는 고수준 진입점입니다.

promise

다른 스레드가 값을 채웁니다

set_value 또는 set_exception으로 연결된 future에 완료 상태를 전달합니다.

packaged_task

호출 객체 future 연결

스레드 풀처럼 실행 위치를 직접 제어해야 할 때 호출 객체와 future 결과를 분리합니다.

move-onlystd::future, std::promise, std::packaged_task는 복사할 수 없고 이동으로 넘깁니다.
예외 전파작업 중 던진 예외는 future에 저장되었다가 get() 호출 지점에서 다시 던져집니다.
시간 제한wait_forwait_until로 결과 준비 여부를 블로킹 없이 확인할 수 있습니다.

결과 전달 비동기 도구 선택은 "누가 작업을 시작하고, 누가 결과를 채우며, 어디서 기다릴 것인가"를 분리해서 보면 단순해집니다.