C++에서 std::async의 사용법은?
A1: std::async는 C++11에서 도입된 비동기 작업 실행을 위한 함수 템플릿입니다. 별도의 스레드에서 함수를 실행하고, 결과를 std::future 객체로 비동기적으로 받을 수 있도록 해줍니다.
Q2: std::async를 사용하려면 어떤 헤더를 포함해야 하나요?
A2: `
```cpp
include
```
Q3: std::async의 기본 문법은 어떻게 되나요?
A3:
```cpp
std::future
```
- `std::launch` 정책: 실행 방식 지정(즉시 실행 또는 지연 실행)
- `Callable&& f`: 호출할 함수 또는 함수객체
- `Args&&... args`: 함수에 전달할 인수들
Q4: std::launch 정책의 종류와 의미는 무엇인가요?
A4:
- `std::launch::async`: 함수가 별도의 스레드에서 즉시 실행됩니다.
- `std::launch::deferred`: 함수 호출은 `future.get()` 등이 호출될 때까지 연기됩니다(동기 실행처럼 작동).
- 둘의 비트 OR(`std::launch::async | std::launch::deferred`)를 지정할 경우 구현에 따라 다르게 동작하며 기본값입니다.
Q5: std::async 사용 예제는 어떻게 되나요?
```cpp
include
include
include
int slow_add(int a, int b) {
std::this_thread::sleep_for(std::chrono::seconds(2));
return a + b;
}
int main() {
// 비동기 실행 - 새 스레드에서 실행
std::future
// 작업이 완료될 때까지 기다리지 않고 다른 작업 수행 가능
std::cout << "계산 중..." << std::endl;
// 결과 가져오기 (만약 작업이 완료 안 되었으면 대기)
int result = fut.get();
std::cout << "결과: " << result << std::endl;
return 0;
```
Q6: std::async 반환값 std::future로 결과를 어떻게 얻나요?
A6: `std::future::get()` 함수를 호출하면 함수 실행 결과를 반환합니다. `get()`은 작업이 완료될 때까지 블록(block)됩니다.
Q7: std::async 실행한 작업이 예외를 던지면 어떻게 처리되나요?
A7: 예외는 `std::future::get()` 호출 시 재발생합니다. 따라서 `get()`을 호출할 때 try-catch 블록으로 예외 처리가 가능합니다.
Q8: std::async에서 호출되는 함수의 반환형이 void인 경우는 어떻게 하나요?
A8: 반환형이 void인 함수도 `std::future
Q9: std::async를 너무 많이 호출하면 어떻게 되나요?
A9: std::async는 내부적으로 스레드를 생성할 수 있기 때문에 무분별하게 호출하면 시스템 리소스를 과다하게 사용할 수 있습니다. 적절한 병렬 작업 수를 관리하는 것이 좋습니다.
Q10: std::async 호출 시 인자 전달 시 주의할 점은?
A10: 함수 인자는 복사되거나 이동되어 전달됩니다. 참조를 전달하려면 `std::ref()`를 사용해야 하며, 그렇지 않으면 참조가 아닌 복사본이 넘어갑니다.
예:
```cpp
int x = 10;
auto fut = std::async(std::launch::async, func, std::ref(x));
```
Q11: std::async와 std::thread의 차이점은 무엇인가요?
A11:
- std::async는 함수 호출 결과의 future를 얻을 수 있어 비동기 결과 관리를 쉽게 합니다.
- std::thread는 직접 스레드를 생성하며 join/detach를 직접 관리해야 합니다.
- std::async는 런처 정책에 따라 스레드 실행 시점을 조절할 수 있습니다.
Q12: std::async 기본 호출 예시는?
A12: 정책 생략 시 비트 OR가 기본으로 적용됩니다.
```cpp
auto fut = std::async(some_function, arg1, arg2);
```
이 경우 구현에 따라 즉시 실행되거나 지연 실행될 수 있습니다.
---
요약:
- `
- `std::async`로 비동기 함수 호출, `std::future`로 결과 관리
- `std::launch` 정책 선택 가능
- `future.get()`으로 결과 받음(결과가 준비될 때까지 대기)
- 예외는 `get()` 시 재전파됨
- 함수 인자 전달 시 복사/이동 또는 `std::ref` 활용
이로써 std::async를 통한 비동기 프로그래밍을 효과적으로 사용할 수 있습니다.
작성자:
이민호 [비회원]
| 작성일자: 1년 전
2024-09-20 17:11:41
조회수: 137 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 137 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.