- 주어진 함수를 비동기로 수행하는 함수.
- 기존에 작성된 함수를 간단하게 스레드로 수행할 수 있다.
- 일반적인 구현은 스레드 풀 사용.
- std::future을 반환한다.
std::future<int> ft = std::async(add, 10, 20);
std::cout << "continue main" << std::endl;
int ret = ft.get();
std::cout << "result : " << ret << std::endl;
Launch Option
// 새로운 쓰레드를 할당받아서 async로 수행해 달라는 뜻. (제일 명확하게 쓰레드 생성)
std::future<int> ft = std::async(std::launch::async, add, 10, 20);
// 지연된 실행 (함수의 결과가 필요할때 실행시켜 달라는 뜻 - 값을 얻을때)
// 다른 쓰레드로 실행하는건 아님.
std::future<int> ft = std::async(std::launch::deferred, add, 10, 20);
// 환경에 따라 async를 쓸수도 있고 deferred를 쓸수도 있다. (대부분은 async를 쓰긴함)
std::future<int> ft = std::async(std::launch::async | std::launch::deferred, add, 10, 20);
// std::launch::async | std::launch::deferred 와 동일.
std::future<int> ft = std::async(add, 10, 20);
주의점
- 반환값으로 받은 future의 get을 안해준다고 해도 future의 소멸자에서 get()을 호출해서 대기한다.
- 반환값을 받지 않았다면, async를 호출한 라인에서 get()이 호출되어서 기다린다.
- 모든 future에 적용되는 사항은 아니고, async로 반환된 future에서만 해당된다.