상세 컨텐츠

본문 제목

[C++] std::async - #1

c++

by 빨간눈동자 2021. 8. 27. 21:58

본문

반응형

c++ 환경에서 thread를 생성하기 위해서는 std::thread와 함께 std::async 를 많이 사용한다. 

 

std::async는 std::task 클래스 기반으로 만들어지며, std::async는 std::thread와 달리 내부적으로 Thread Pool을 만들어 Thread를 관리하며, std::thread보다 안정적이다. 

std::async는 std::future 객체를 리턴한다. 

거두절미하고 아래 예제코드를 살펴보도록 하자. 

 

#include <iostream>
#include <thread>
#include <chrono>
#include <future>

using namespace std;

void print(int data)
{
		cout << "data : " << data << endl;
		std:this_thread::sleep_for(2s);
}

int main()
{
	future<void> ft = async(print, 10);
	cout << "continue main" << endl;
	ft.wait();
	cout << "main end" << endl;
}

 

future<void> ft = async(print, 10);

print()함수를 thread로 동작하기위해 async() 인자로 함수와 함수에 전달될 인자를 전달한다. 

async()는 future 객체를 리턴하기에 future class 변수에 저장한다. 

※ print() 함수가 return 되는 값이 없기에 future class를 void 형으로 선언한다. 

   만약 print() 함수가 int 값을 리턴한다면, future<int> 와 같이 선언해야한다.

#include <iostream>
#include <thread>
#include <chrono>
#include <future>

using namespace std;

int print(int data)
{
cout << "data : " << data << endl;
std:this_thread::sleep_for(2s);
return data;
}

int main()
{
future<int> ft = async(print, 10);
cout << "continue main" << endl;
int ret = ft.get();
cout << "main end : " << ret << endl;
}

위 예제는 thread 인 print() 함수에서 전달받은 인자를 그대로 return 하도록 변경해보았다. 

 

다시 본론으로 돌아와서.. 

ft.wait();

async()를 실행했다고 바로 thread가 시작하는 것은 아니다. 결과에서도 확인할 수 있 듯이, 

print()로 전달된 data (10) 보다 "continue main data" 문구가 먼저 출력되는 것을 확인할 수 있다. 

asyn로 선언된 thread는 wait() 나 get() 함수를 만나는 시작하게 된다. 

그래서 위와 같은 출력 결과를 확인할 수 있다. 

 

 

 

반응형

'c++' 카테고리의 다른 글

[C++] std::future - wait_for  (0) 2021.08.28
[C++] std::async - #2  (0) 2021.08.27
[C++] promise & future  (0) 2021.08.24
[C++] thread 생성 방법들  (0) 2021.08.23
[C++] thread 생성 및 인자 전달  (0) 2021.08.23

관련글 더보기