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()이 데이터 흐름의 완료지점이에요.