promise — std::promise
promise — std::promise
std::promise 클래스 템플릿은 스레드 사이에 객체(값 또는 예외)를 전달할 수 있게 하는 도구예요. C++11에서 도입됐어요. <future> 헤더에 있어요.
promise에 값을 저장하면, 연관된 std::future가 그 값을 받을 수 있어요 (비동기 결과 통신의 "쓰는" 쪽).
출처: cppreference
본문
// <future> 헤더, C++11
template< class R > class promise; // (1) 기본
template< class R > class promise<R&>; // (2) 참조 — 스레드 간 객체 전달
template<> class promise<void>; // (3) void 특수화
사용 예 — 값 설정
#include <future>
#include <thread>
#include <iostream>
void producer(std::promise<int> p) {
p.set_value(42); // 결과 저장
}
int main() {
std::promise<int> p;
std::future<int> f = p.get_future();
std::thread t(producer, std::move(p)); // promise는 이동
t.join();
std::cout << f.get(); // 42
}
주요 멤버
| 멤버 | 설명 |
|---|---|
get_future() |
결과를 받을 std::future 반환 |
set_value(v) |
값 저장 (재설정 불가) |
set_value_at_thread_exit(v) |
스레드 종료 시 값 저장 |
set_exception(e) |
예외 저장 |
set_exception_at_thread_exit(e) |
스레드 종료 시 예외 저장 |
예외 전달
void risky(std::promise<int> p) {
try {
// 작업
p.set_value(10);
} catch (...) {
p.set_exception(std::current_exception()); // 예외 전달
}
}
// future.get()에서 그 예외가 다시 던져짐
주의
promise가 파괴되기 전에 값을 설정하지 않으면,broken_promise오류가 future에 전달돼요.
std::promise<int> p;
std::future<int> f = p.get_future();
// p 파괴 (값 미설정) → f.get()은 broken_promise 예외
std::promise는 스레드 간에 값을·예외를 안전하게 전달하는 비동기 통신의 "생산자" 쪽이에요. std::future가 "소비자" 쪽이에요.