thread_packaged_task
thread_packaged_task (비동기 작업 래퍼)
std::packaged_task는 C++11부터 사용할 수 있는 클래스 템플릿이에요. 호출 가능한 대상을 감싸서 비동기적으로 실행할 수 있게 해 주고, 실행 결과나 예외를 공유 상태에 저장해요. 저장된 결과는 std::future 객체를 통해 안전하게 접근할 수 있어요.
출처: cppreference
본문
개요
std::packaged_task 클래스 템플릿은 함수, 람다 표현식, bind 표현식 또는 다른 함수 객체와 같은 호출 가능한 대상을 감싸서 비동기적으로 호출할 수 있게 해요. 이때 반환 값이나 던져진 예외는 공유 상태에 저장되고, std::future 객체를 통해 접근할 수 있어요.
헤더 <future>에 정의됨 |
||
|---|---|---|
template < class > class packaged_task ; |
(1) | (C++11부터) (정의되지 않음) |
template < class R , class ... Args > class packaged_task < R ( Args ...) > ; |
(2) | (C++11부터) |
std::function과 마찬가지로 std::packaged_task는 다형적이며 할당기를 인식하는 컨테이너예요. 저장된 호출 가능 대상은 힙에 할당되거나 제공된 할당기로 할당될 수 있어요. (C++17까지)
멤버 함수
| 함수 | 설명 |
|---|---|
(constructor) |
작업 객체를 생성해요 |
(destructor) |
작업 객체를 소멸해요 |
operator= |
작업 객체를 이동해요 |
valid |
작업 객체가 유효한 함수를 가지고 있는지 확인해요 |
swap |
두 작업 객체를 교환해요 |
get_future |
약속된 결과와 연결된 std::future를 반환해요 |
operator() |
함수를 실행해요 |
make_ready_at_thread_exit |
현재 스레드가 종료된 후에만 결과가 준비되도록 함수를 실행해요 |
reset |
이전 실행 결과를 버리고 상태를 재설정해요 |
비멤버 함수
| 함수 | 설명 |
|---|---|
std::swap (std::packaged_task) (C++11) |
std::swap 알고리즘을 특수화해요 |
헬퍼 클래스
| 클래스 | 설명 |
|---|---|
std::uses_allocator <std::packaged_task> (C++11) (C++17까지) |
std::uses_allocator 타입 특성을 특수화해요 |
추론 가이드 (C++17부터)
C++17부터 std::packaged_task에 대한 추론 가이드가 제공되어, 템플릿 인자를 생략할 수 있어요.
예제
#include <cmath>
#include <functional>
#include <future>
#include <iostream>
#include <thread>
// unique function to avoid disambiguating the std::pow overload set
int f(int x, int y) { return std::pow(x, y); }
void task_lambda()
{
std::packaged_task<int(int, int)> task([](int a, int b)
{
return std::pow(a, b);
});
std::future<int> result = task.get_future();
task(2, 9);
std::cout << "task_lambda:\t" << result.get() << '\n';
}
void task_bind()
{
std::packaged_task<int()> task(std::bind(f, 2, 11));
std::future<int> result = task.get_future();
task();
std::cout << "task_bind:\t" << result.get() << '\n';
}
void task_thread()
{
std::packaged_task<int(int, int)> task(f);
std::future<int> result = task.get_future();
std::thread task_td(std::move(task), 2, 10);
task_td.join();
std::cout << "task_thread:\t" << result.get() << '\n';
}
int main()
{
task_lambda();
task_bind();
task_thread();
}
출력:
task_lambda: 512
task_bind: 2048
task_thread: 1024
결함 보고서
다음의 동작 변경 결함 보고서는 이미 발표된 C++ 표준에 소급 적용되었어요.
| DR | 적용 대상 | 발표된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 3117 | C++17 | packaged_task에 대한 추론 가이드가 누락되었음 |
추가됨 |
같이 보기
future (C++11) |
비동기적으로 설정되는 값을 기다려요 (클래스 템플릿) |
|---|