[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 |