함수 실행과 future 생성을 맡깁니다
스레드 생성과 결과 전달을 직접 엮지 않아도 되는 고수준 진입점입니다.
비동기 작업은 결과를 바로 반환하지 않고
std::future 핸들을 통해 대기, 조회, 예외 전달을
처리합니다.
std::launch::async는 즉시 별도 실행,
deferred는 get() 때 실행됩니다.
get()은 결과가 준비될 때까지 기다리고, 한 번
호출하면 future의 값은 소비됩니다.
스레드 생성과 결과 전달을 직접 엮지 않아도 되는 고수준 진입점입니다.
set_value 또는 set_exception으로 연결된
future에 완료 상태를 전달합니다.
스레드 풀처럼 실행 위치를 직접 제어해야 할 때 호출 객체와 future 결과를 분리합니다.
std::future, std::promise,
std::packaged_task는 복사할 수 없고 이동으로
넘깁니다.
get() 호출
지점에서 다시 던져집니다.
wait_for와 wait_until로 결과 준비 여부를
블로킹 없이 확인할 수 있습니다.
결과 전달 비동기 도구 선택은 "누가 작업을 시작하고, 누가 결과를 채우며, 어디서 기다릴 것인가"를 분리해서 보면 단순해집니다.