본문 바로가기

C++/STL

std::packaged_task

[1. 개요]

std::packaged_task는 C++11부터 도입된 기능으로, 

함수나 함수 객체를 비동기적으로 실행시키고, 그 결과를 std::future를 통해 받아올 수 있도록 감싸주는 wrapper.

 

기본적으로 std::thread 로 실행 한 task 의 리턴 값을 받기 위한 별다른 메커니즘이 없다.

  • std::promise 를 사용하는 것도 한가지 방법이기는 하지만,,,

그러나, std::async 와 마찬가지로 task 의 리턴 값을 받기 위한 메커니즘을 제공한다는 측면이 있다.

  • std::async 는 join() 을 따로 호출하지 않아도 되지만,
  • std::thread 를 통해 호출하게 하므로, join() 의 호출은 필요 함.

[2. 예제]

가장 일반적인 사용 방법

  • std::packaged_task 를 생성
  • future 를 얻고,
  • thread 생성 시, packaged_task 를 이동 시킴.
#include <iostream>
#include <future>
#include <thread>
#include <chrono>

int long_compute(int x)
{
    std::this_thread::sleep_for(std::chrono::seconds(2));
    return x*x;
}

int main()
{
    // 함수를 넘기거나, 람다식을 작성하도록 한다.
    // 
    //std::packaged_task<int(int)> task(long_compute);
    std::packaged_task<int(int)> task(
        [&](int x) {
            std::this_thread::sleep_for(std::chrono::seconds(2));
            return x*x;
        }
    );

    // get_future 를 먼저 호출하고,
    std::future<int> result = task.get_future();
    // 스레드를 실행하도록 한다.
    std::thread t(std::move(task), 10);

    std::cout << "Waiting result" << std::endl;
    // future 의 get 을 이용하여, 작업이 끝날 때 까지 대기한다.
    int value = result.get();

    std::cout << "result: " << value << std::endl;

    t.join();
    return 0;

 

'C++ > STL' 카테고리의 다른 글

std::thread vs std::async  (0) 2025.05.01
std::stringstream  (0) 2025.04.24
erase 계열 함수...  (0) 2025.02.11
map 과 unordered_map 의 차이점.  (0) 2024.10.23
chrono 타이머  (0) 2024.10.07