future — std::future

future — std::future

std::future 클래스 템플릿은 비동기 연산의 결과에 접근하는 메커니즘을 제공해요. C++11에서 도입됐어요. <future> 헤더에 있어요.

  • 비동기 작업의 결과를 "나중에" 받을 수 있는 통신 채널이에요.
  • std::async, std::packaged_task, std::promise와 함께 쓰여요.

출처: cppreference

본문

// <future> 헤더, C++11
template< class T > class future;       // (1) 일반
template< class T > class future<T&>;   // (2) 참조
template<> class future<void>;          // (3) void

사용 예

#include <future>
#include <iostream>

// std::async로 비동기 실행
std::future<int> f = std::async(std::launch::async, [] {
    return 6 * 7;               // 42
});
int result = f.get();           // 결과를 기다렸다가 받음
std::cout << result << '\n';    // 42

주요 연산

연산 설명
get() 결과를 기다렸다가 반환 (예외 재전달)
wait() 결과가 준비될 때까지 블로킹
wait_for(dur) / wait_until(tp) 시간 제한 대기
valid() 공유 상태 보유 여부
share() shared_future로 변환

promise/packaged_task와 함께

// promise로 결과 설정
std::promise<int> p;
std::future<int> f = p.get_future();
std::thread([&p]{ p.set_value(7); }).detach();
int v = f.get();   // 7
// packaged_task로 함수 호출을 future에 연결
std::packaged_task<int()> task([]{ return 99; });
auto ft = task.get_future();
task();                 // 실행
std::cout << ft.get();  // 99

주의

  • get()한 번만 호출할 수 있어요 (shared_future는 여러 번).
  • 결과로 예외도 전달돼요 — get()이 그 예외를 다시 던져요.
auto f2 = std::async(std::launch::async, [] { throw std::runtime_error("x"); });
try { f2.get(); } catch (const std::runtime_error& e) { /* ... */ }

std::future는 비동기 작업의 결과·예외를 스레드 경계를 넘어 안전하게 전달하는 표준 채널이에요. get()이 데이터 흐름의 완료지점이에요.

더 알아보기 (Learn more)

cppreference