Async

비동기 완료·실패·취소 경로

future, promise, async는 작업을 나중에 끝내는 방식이다. 결과를 언제 기다릴지, 예외를 어디서 받을지, 기다리지 않는 작업을 어떻게 정리할지 정해야 한다.

01

실행 정책 확인

std::async 기본 정책은 구현이 deferred를 택할 수 있으므로 즉시 병렬이 필요하면 launch::async를 명시한다.

02

결과 회수 보장

future::get은 결과뿐 아니라 작업 중 던진 예외도 다시 던진다.

03

대기 시간을 제한한다

wait_for, stop_token, timeout 정책으로 무한 대기를 막는다.

std::future
단일 소비 get을 한 번 호출하면 결과를 꺼내고 더 이상 같은 future에서 다시 얻을 수 없다.
공유가 필요하면 shared_future다.
std::async
간편한 비동기 함수를 실행하고 future로 결과와 예외를 돌려준다.
launch policy를 확인한다.
std::promise
수동 생산자 다른 스레드에서 set_value 또는 set_exception으로 future를 완료한다.
set을 안 하면 broken promise가 된다.
timeout
운영 안전선 외부 I/O나 긴 계산은 기다림 상한을 가져야 한다.
타임아웃 뒤 작업 수명도 정해야 한다.

정책 · 예외 · 수명 점검

정책 병렬 실행을 기대하면서 deferred 실행 가능성을 방치하지 않는가.
예외 future::get을 호출하지 않아 작업 실패를 관찰하지 못하는가.
수명 비동기 작업이 참조하는 객체가 결과 회수 전에 사라지지 않는가.

명시 async

auto result = std::async(std::launch::async, [] {
    return compute_report();
});

auto report = result.get(); // 예외도 이 지점에서 다시 던져진다.