std::async()는 비동기 작업(asynchronous task)을 간편하게 실행하기 위해서 사용된다.
목적 설명
✅ 병렬 처리 | 여러 작업을 동시에 실행하여 성능 향상 가능 |
✅ 비동기 실행 | 함수 실행을 백그라운드에서 수행하고, 나중에 결과를 받을 수 있음 |
✅ 스레드 안전성 향상 | 스레드 생성 및 관리의 복잡성을 숨겨줌 |
✅ 코드 간결성 | std::thread보다 간단하게 비동기 코드 작성 가능 |
✅ std::future와의 연동 | 결과를 나중에 받아올 수 있도록 std::future을 반환 |
예제 코드는 아래와 같음
#include <iostream>
#include <future>
using namespace std;
bool is_prime(int x) {
cout << "Calculating prime...\n";
for (int i = 2; i < x; ++i) {
if (x % i == 0) {
return false;
}
}
return true;
}
int main() {
future<bool> pFuture = std::async(std::launch::async, is_prime, 343321);
cout << "Checking whether 343321 is a prime number.\n";
// future의 결과는 task가 수행된 이후 처리 가능
bool result = pFuture.get();
if (result) {
cout << "Prime found.\n";
} else {
cout << "No prime found.\n";
}
return 0;
}
std::launch::async: 즉시 새 스레드에서 실행
std::launch::deferred: .get() 또는 .wait()가 호출될 때까지 실행하지 않음 (지연 실행)
🚨 주의할 점
- future.get()은 반드시 호출해야 합니다. 호출하지 않으면 예외가 무시되거나 자원이 해제되지 않을 수 있습니다.
- std::async는 std::thread와 달리 join을 직접 할 필요 없고, future를 통해 lifecycle이 관리됩니다.
- std::async는 내부적으로 thread pool을 사용하지 않고, 호출할 때마다 새 스레드를 생성할 수도 있음 → 과도하게 사용하면 오히려 성능 저하
std::async와 std::future의 조합은 단순히 비동기 실행을 위한 도구를 넘어서, 작업(task)의 실행 흐름(선후 관계)을 명시적으로 제어하는 수단 이다.
- 비동기 병렬성과 제어된 동기화의 균형을 잡을 수 있습니다.
- 의존성이 있는 작업을 안전하게 병렬 실행할 수 있게 해줍니다.
- 일반적인 std::thread로는 어렵고 verbose한 코드가 async + future로 깔끔하게 표현됩니다.
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++에서 Thread-Safe (0) | 2025.07.02 |
---|---|
멀티 쓰레드 - std::promise (0) | 2025.05.14 |
countDownLatch는 언제 쓰는게 좋을까? (0) | 2025.05.14 |
멀티쓰레딩 - Condition Variable (0) | 2025.05.13 |
멀티 쓰레딩 - try_lock (0) | 2025.05.13 |