std::async() 는 (1) 호출가능한 object(ex. 함수), (2) 해당 object에 전달할 prarameter, (3) policy가 있다.
이번에는 policy에 대해 좀 더 자세히 알아보도록 하자.
std::launch::async : 비동기 연산을 수행, async() 호출 시 바로 thread 수행됨.
std::launch::deferred : 지연 연산을 수행, async() 호출 시 thread가 바로 호출되지 않고, get()이나 wait() 를 만나면
thread가 수행된다.
무슨말인지 조금 애매하니, 바로 예제를 통해 확인해보도록 하자.
#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이 함께 출력됨 )
#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" 로그를 출력하게 된다.
구현에 따라 달라진다는 이야기인데.. 그냥 이렇게 사용하지 말자...
[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 |