packaged_task — std::packaged_task

packaged_task — std::packaged_task

std::packaged_task 클래스 템플릿은 어떤 Callable 대상(함수, 람다, 함수 객체)을 감싸, 그 호출 결과를 std::future로 제공하는 도구예요. C++11에서 도입됐어요. <future> 헤더에 있어요.

호출이 완료되면 결과(또는 예외)가 공유 상태에 저장되고, future로 받을 수 있어요.

출처: cppreference

본문

// <future> 헤더, C++11
template< class > class packaged_task;        // (1) 정의되지 않음

template< class R, class ...Args >
class packaged_task<R(Args...)>;              // (2)

사용 예 — 직접 실행

#include <future>
#include <iostream>

std::packaged_task<int(int,int)> task([](int a, int b) {
    return a + b;
});

std::future<int> f = task.get_future();
task(3, 4);           // 실행
std::cout << f.get(); // 7

사용 예 — 스레드에서 실행

#include <future>
#include <thread>

std::packaged_task<int()> task([]{ return 42; });
std::future<int> f = task.get_future();

std::thread t(std::move(task));   // task는 이동해서 스레드로
t.join();
int result = f.get();   // 42

주요 멤버

멤버 설명
get_future() 결과를 받을 std::future 반환
operator() 태스크 호출 실행
make_ready_at_thread_exit() 스레드 종료 시 결과 준비
valid() 유효한 공유 상태 보유 여부
reset() 공유 상태 재설정

람다/일반 호출

std::packaged_task<void()> pt([]{
    std::cout << "task running\n";
});
pt.get_future();
pt();

std::packaged_task는 "호출을 나중에 실행하도록 패키징하고, 결과를 future로 받는" 중간자 역할이에요. std::async가 더 간편하지만, 태스크 큐·수동 실행이 필요할 때 유용해요.

더 알아보기 (Learn more)

cppreference