std::future<T>:: get
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Getting the result | ||||
|
future::get
|
||||
| State | ||||
|
기본 템플릿
|
||
|
T get
(
)
;
|
(1) | (C++11부터) |
|
std::
future
<
T
&
>
특수화
|
||
|
T
&
get
(
)
;
|
(2) | (C++11부터) |
|
std::
future
<
void
>
특수화
|
||
|
void
get
(
)
;
|
(3) | (C++11부터) |
get
멤버 함수는 공유 상태가 준비될 때까지(
wait()
호출을 통해) 대기한 후, 공유 상태에 저장된 값(있는 경우)을 검색합니다. 이 함수를 호출한 직후,
valid()
는
false
가 됩니다.
만약 valid() 이 false 인 상태에서 이 함수를 호출하면, 동작은 정의되지 않습니다.
목차 |
반환값
예외
만약 예외가 future가 참조하는 공유 상태에 저장되었다면 (예: std::promise::set_exception() 호출을 통해) 해당 예외가 throw됩니다.
참고 사항
C++ 표준은 구현체들이 호출 전에 valid() 가 false 인 경우를 감지하고 std::future_error 를 std::future_errc::no_state 오류 조건으로 던지도록 권장합니다.
예제
#include <chrono> #include <future> #include <iostream> #include <string> #include <thread> std::string time() { static auto start = std::chrono::steady_clock::now(); std::chrono::duration<double> d = std::chrono::steady_clock::now() - start; return "[" + std::to_string(d.count()) + "s]"; } int main() { using namespace std::chrono_literals; { std::cout << time() << " launching thread\n"; std::future<int> f = std::async(std::launch::async, [] { std::this_thread::sleep_for(1s); return 7; }); std::cout << time() << " waiting for the future, f.valid() = " << f.valid() << '\n'; int n = f.get(); std::cout << time() << " f.get() returned " << n << ", f.valid() = " << f.valid() << '\n'; } { std::cout << time() << " launching thread\n"; std::future<int> f = std::async(std::launch::async, [] { std::this_thread::sleep_for(1s); return true ? throw std::runtime_error("7") : 7; }); std::cout << time() << " waiting for the future, f.valid() = " << f.valid() << '\n'; try { int n = f.get(); std::cout << time() << " f.get() returned " << n << ", f.valid() = " << f.valid() << '\n'; } catch (const std::exception& e) { std::cout << time() << " caught exception " << e.what() << ", f.valid() = " << f.valid() << '\n'; } } }
가능한 출력:
[0.000004s] launching thread [0.000461s] waiting for the future, f.valid() = 1 [1.001156s] f.get() returned with 7, f.valid() = 0 [1.001192s] launching thread [1.001275s] waiting for the future, f.valid() = 1 [2.002356s] caught exception 7, f.valid() = 0
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 2096 | C++11 |
오버로드
(1)
이
T
가
MoveAssignable
인지 확인해야 했음
|
필요하지 않음 |
참고 항목
|
future가 공유 상태를 가지고 있는지 확인합니다
(public member function) |