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++] 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 |