C++에서 std::future와 std::promise의 차이는?
_____A1:
- std::future 는 비동기 연산의 결과를 나중에 받을 수 있도록 해주는 객체입니다. 즉, 미래에 어떤 값이 준비될 때까지 대기하고 결과를 얻는 데 사용됩니다.
- std::promise 는 미래에 값을 제공하기 위한 객체로, 어떤 스레드나 함수가 결과 값을 설정할 때 사용합니다. 즉, 약속한 값을 전달하는 쪽 역할입니다.
---
Q2: std::future와 std::promise의 역할이 어떻게 다른가요?
A2:
- std::promise 는 값을 설정하는(producer) 역할을 합니다. 어떤 값이나 예외를 나중에 전달할 수 있도록 약속합니다.
- std::future 는 설정된 값을 받는(consumer) 역할을 하며, 값을 받을 때까지 기다리거나 값이 준비되면 즉시 접근할 수 있습니다.
---
Q3: std::future와 std::promise는 어떻게 연결되나요?
A3:
- std::promise 객체의 `get_future()` 멤버 함수를 호출하면, 해당 promise와 연결된 std::future 객체를 얻을 수 있습니다.
- 이렇게 얻은 std::future는 약속된 값이 설정될 때까지 대기하며 결과를 받을 수 있습니다.
---
Q4: std::promise 없이는 std::future를 사용할 수 없나요?
A4:
- 아니요. std::future는 std::async 함수 호출과 같은 다른 방법으로도 생성될 수 있습니다.
- 그러나 std::promise는 직접 값을 설정하고 제어하는 경우에 주로 사용됩니다.
---
Q5: std::future에서 결과를 어떻게 얻나요?
A5:
- std::future 객체의 `get()` 함수를 호출하면, 값이 준비되어 있지 않으면 대기하고, 준비되면 값을 반환합니다.
- `get()` 호출 후에는 해당 future 객체는 더 이상 유효하지 않으므로 중복 호출은 불가능합니다.
---
A6:
- std::promise 객체의 `set_value(value)` 함수를 호출하여 값을 설정합니다.
- 또는 비동기 작업 중 예외가 발생하면 `set_exception()`으로 예외를 전달할 수도 있습니다.
---
Q7: std::future와 std::promise를 같이 써야 하는 경우는 언제인가요?
A7:
- 직접 제어하는 스레드 또는 작업에서 결과를 설정하고, 다른 스레드에서 그 결과를 기다려야 할 때 사용합니다.
- 예를 들어, 조건 변수와 유사한 역할을 하면서 비동기 통신을 구현할 때 유용합니다.
---
Q8: std::promise와 std::future를 사용할 때 주의해야 할 점은?
A8:
- std::promise에 값을 한 번만 설정할 수 있으며 중복 설정하면 std::future_error가 발생합니다.
- std::future의 `get()` 는 한 번만 호출 가능하며, 이후 호출 시 예외가 발생합니다.
- promise가 파괴되기 전에 값을 설정하지 않으면, 연결된 future의 `get()` 은 `broken_promise` 예외를 던질 수 있습니다.
---
요약:
| 구분 | std::promise | std::future |
|------------|----------------------------------|---------------------------------|
| 역할 | 값을 설정하고 전달하는 쪽 | 값을 받아 처리하는 쪽 |
| 생성 | 직접 생성, `get_future()`로 future 생성 | promise 또는 async 등이 생성 |
| 값 설정 | `set_value()`, `set_exception()` | 없음 |
| 값 받기 | 없음 | `get()` 호출로 값 획득 |
| 주 사용처 | 프로듀서 역할 스레드, 작업 | 소비자 역할 스레드 |
---
참고:
- std::future/std::promise는 C++11부터 표준 라이브러리에 추가된 비동기 처리 도구입니다.
- 복잡한 동시성 처리 시 매우 유용하지만, 적절한 예외 처리와 상태 관리를 반드시 해야 합니다.
이들은 서로 밀접하게 연관되어 있지만, 그 역할과 사용 방식에서 중요한 차이점이 있습니다.
아래에서 이 두 클래스의 정의, 사용 방법, 그리고 차이점에 대해 자세히 설명하겠습니다.
std::promise `std::promise`는 비동기 작업의 결과를 설정하는 데 사용되는 클래스입니다.
주로 다른 스레드에서 실행되는 작업의 결과를 전달하기 위해 사용됩니다.
`std::promise`는 결과를 저장하고, 이를 통해 `std::future` 객체와 연결됩니다.
- 주요 기능 : - `set_value()`: 비동기 작업이 성공적으로 완료되었을 때 결과 값을 설정합니다.
- `set_exception()`: 비동기 작업이 실패했을 때 예외를 설정합니다.
- 사용 예 : ```cpp include
`std::promise`와 연결되어 있으며, 비동기 작업이 완료될 때까지 대기할 수 있는 기능을 제공합니다.
- 주요 기능 : - `get()`: 비동기 작업의 결과를 가져옵니다.
작업이 완료되지 않았다면, 이 메서드는 결과가 준비될 때까지 블록됩니다.
- `wait()`: 비동기 작업이 완료될 때까지 대기합니다.
- `valid()`: `std::future` 객체가 유효한지 확인합니다.
- 사용 예 : 위의 예제에서 `std::future`는 `std::promise`와 연결되어 비동기 작업의 결과를 가져오는 데 사용됩니다.
std::promise와 std::future의 차이점 1. 역할 : - `std::promise`: 비동기 작업의 결과를 설정하는 역할을 합니다.
결과를 생산하는 쪽에서 사용됩니다.
- `std::future`: 비동기 작업의 결과를 가져오는 역할을 합니다.
결과를 소비하는 쪽에서 사용됩니다.
2. 생성 및 소멸 : - `std::promise`는 결과를 설정하기 위해 생성되며, 결과가 설정되면 `std::future`와 연결됩니다.
- `std::future`는 `std::promise`로부터 생성되며, 결과를 가져오기 위해 사용됩니다.
3. 예외 처리 : - `std::promise`는 비동기 작업 중 발생한 예외를 `set_exception()` 메서드를 통해 설정할 수 있습니다.
- `std::future`는 `get()` 메서드를 호출할 때 예외가 발생하면 이를 다시 던져서 호출자에게 전달합니다.
4. 사용 패턴 : - `std::promise`는 일반적으로 비동기 작업을 수행하는 스레드 내에서 사용됩니다.
- `std::future`는 비동기 작업의 결과를 기다리거나 가져오는 스레드에서 사용됩니다.
결론 `std::promise`와 `std::future`는 C++에서 비동기 프로그래밍을 구현하는 데 필수적인 도구입니다.
`std::promise`는 결과를 설정하는 역할을 하고, `std::future`는 그 결과를 가져오는 역할을 합니다.
이 두 클래스를 적절히 활용하면, 복잡한 비동기 작업을 보다 쉽게 관리하고, 예외 처리를 포함한 안전한 코드 작성을 할 수 있습니다.
작성자:
박서준 [비회원]
| 작성일자: 1년 전
2024-09-20 17:11:41
조회수: 159 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 159 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.