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) 비동기적으로 설정되는 값을 기다려요 (클래스 템플릿)

더 알아보기 (Learn more)

cppreference