Program Language/C & C++

[C++] packaged_task

야곰야곰+책벌레 2021. 10. 7. 19:47
728x90
반응형

C++는 packaged_task를 지원해 해당 태스크를 다른 thread에 전달해 수행할 수 있다.

우선 예제를 살펴보면,

#include <iostream>
#include <thread>
#include <future>
using namespace std;

int Add(int a, int b)
{
	cout << "[thread idx:" << this_thread::get_id() << "] a + b = " << a + b << endl;
	return a + b;
}

int main()
{
	packaged_task<int(int, int)> task(Add); // 두 개의 int를 받아 int를 반환하는 패키지 태스크 생성
	future<int> ret = task.get_future(); // 태스크의 future 객체 지정 태스크는 내부적으로 promise 객체에 반환 값을 설정
	thread(std::move(task), 1, 2).join(); // 태스크 객체를 실행할 thread 지정

	cout << "[thread idx: " << this_thread::get_id() << "] ret = " << ret.get() << endl;
	
	return 0;
}

std::bind를 사용하면 다음과 같이 표현할 수 있다.

int main()
{
	auto task = packaged_task<int()>(std::bind(Add, 1, 2));
	auto ret = task.get_future(); // 태스크의 future 객체 지정 태스크는 내부적으로 promise 객체에 반환 값을 설정
	thread(std::move(task)).join(); // 태스크 객체를 실행할 thread 지정

	cout << "[thread idx: " << this_thread::get_id() << "] ret = " << ret.get() << endl;
	
	return 0;
}

예제처럼 특정 태스크를 수행할 수 있는 thread를 지정할 수 있다면 package task를 저 정할 queue로 생성하고 해당 queue를 thread들이 loop를 돌면서 queue에서 태스크를 가져와 작업을 수행하는 방식의 thread pool을 만들거나, network, db, file io 관련 thread를 분리하고 각각에 대한 thread와 태스크 queue를 분리해 관리한다면 과도한 thread로 인한 문제를 해결할 수 있을 것이다.

728x90
반응형

'Program Language > C & C++' 카테고리의 다른 글

[C++] values  (0) 2021.10.08
[C++] std::move  (0) 2021.10.08
[C++] thread_local  (0) 2021.10.07
[C++] error LNK2001: unresolved external symbol (Static member)  (0) 2021.10.07
[C++] recursive_mutex  (0) 2021.10.07