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가 더 간편하지만, 태스크 큐·수동 실행이 필요할 때 유용해요.