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가 "소비자" 쪽이에요.

더 알아보기 (Learn more)

cppreference