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부터 표준 라이브러리에 추가된 비동기 처리 도구입니다.
- 복잡한 동시성 처리 시 매우 유용하지만, 적절한 예외 처리와 상태 관리를 반드시 해야 합니다.
작성자:
박서준 [비회원]
| 작성일자: 1년 전
2024-09-20 17:11:41
조회수: 172 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 172 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.