본문 바로가기
프로그래밍 언어/C++

멀티쓰레딩 - std::async()

by 규봉봉이 2025. 5. 14.

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