상세 컨텐츠

본문 제목

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

c++

by 빨간눈동자 2021. 8. 27. 23:59

본문

반응형

std::async() 는 (1) 호출가능한 object(ex. 함수), (2) 해당 object에 전달할 prarameter, (3) policy가 있다. 

이번에는 policy에 대해 좀 더 자세히 알아보도록 하자. 

 

std::launch::async :  비동기 연산을 수행, async() 호출 시 바로 thread 수행됨. 

std::launch::deferred : 지연 연산을 수행, async() 호출 시 thread가 바로 호출되지 않고, get()이나 wait() 를 만나면         

                             thread가 수행된다. 

st

무슨말인지 조금 애매하니, 바로 예제를 통해 확인해보도록 하자. 


std::launch::async

#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(launch::async, print, 10);
	cout << "call async()" << endl;
	std:this_thread::sleep_for(1s);
	cout << "continue main" << endl;
	//int ret = ft.get();
	cout << "main end : " << endl;// << ret << endl;
}

async()를 launch::async와 함께 사용하면, async() 함수가 호출되는 즉시, thread 함수인 print() 함수가 수행되는 것을 확인할 수 있다. ( call async()와 data : 10이 함께 출력됨 ) 

 

std::launch::deferred

#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(launch::deferred, print, 10);
	cout << "call async()" << endl;
	std:this_thread::sleep_for(1s);
	cout << "continue main" << endl;
	int ret = ft.get();
	cout << "main end : " << ret << endl;
}

launch::deferred와 함께 async()를 수행하면 위 예제의 결과와 같이 

"call async()" 가 먼저 출력되고, 1초 sleep 후, "continue main" 로그가 출력된다. 

이후 ft.get() 을 만나게 되면, thread 함수인 print() 함수가 수행되며, print() 함수 안에서 "data : 10" 로그를 출력하게 된다. 

 

std::launch::async | std::launch::deferred

구현에 따라 달라진다는 이야기인데.. 그냥 이렇게 사용하지 말자...

반응형

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

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

관련글 더보기