<future>
함수
async
future_category
make_error_code
make_error_condition
swap
|
async
비동기 공급자를 나타냅니다.
template <class Fn, class... ArgTypes>
future<typename result_of<Fn(ArgTypes...)>::type>
async(Fn&& fn, ArgTypes&&... args);
template <class Fn, class... ArgTypes>
future<typename result_of<Fn(ArgTypes...)>::type>
async(launch policy, Fn&& fn, ArgTypes&&... args);
매개 변수
policy
launch
값입니다.
설명
약어의 정의:
약어 | 설명 |
---|---|
dfn |
호출하는 decay_copy(forward<Fn>(fn)) 의 결과입니다. |
dargs |
decay_copy(forward<ArgsTypes>(args...)) 호출의 결과입니다. |
Ty |
result_of<Fn(ArgTypes...)>::type 형식입니다. |
첫 번째 템플릿 함수는 async(launch::any, fn, args...)
를 반환합니다.
두 번째 함수는 연결된 비동기 상태가 값과 함께 dfn
결과를 보유하는 개체와 dargs
별도의 실행 스레드를 관리하는 스레드 개체를 반환 future<Ty>
합니다.
시작 이외의 형식이 아니면 decay<Fn>::type
두 번째 함수는 오버로드 확인에 참여하지 않습니다.
C++ 표준은 정책이 있는 경우 함수가 launch::async
새 스레드에서 호출 가능한 개체를 호출하는 것처럼 동작한다고 명시합니다. 즉, 일반적으로 새 스레드를 만들지만 구현은 다른 메커니즘을 사용하여 동등한 동작을 달성할 수 있습니다. 그러나 Microsoft 구현은 현재 이 동작을 엄격하게 준수하지 않습니다. Windows ThreadPool에서 스레드를 가져옵니다. 이 스레드는 새 스레드가 아닌 재활용된 스레드를 제공할 수 있습니다. 즉, launch::async
정책이 효과적으로 .로 launch::async|launch::deferred
구현됩니다. ThreadPool 기반 구현의 또 다른 의미는 스레드가 완료될 때 스레드 지역 변수가 제거된다는 보장이 없다는 것입니다. 스레드가 재활용되고 새 호출에 async
제공된 경우 이전 변수는 여전히 존재합니다. 와 함께 async
스레드 지역 변수를 사용하지 않는 것이 좋습니다.
policy
가 launch::deferred
일 경우 연결된 비동기 상태에 지연된 함수가 있는 것으로 표시하고 반환합니다. 연결된 비동기 상태가 실제로 준비될 때까지 기다리는 시간이 없는 함수에 대한 첫 번째 호출은 평가하여 지연된 함수를 호출합니다 INVOKE(dfn, dargs..., Ty)
.
모든 경우에 개체의 future
연결된 비동기 상태는 예외를 throw하거나 정상적으로 반환하여 평가 INVOKE(dfn, dargs..., Ty)
가 완료될 때까지 준비되지 않습니다. 연결된 비동기 상태의 결과는 throw된 경우 예외이거나 평가에서 반환하는 값입니다.
참고 항목
future
시작된 작업에 연결된 마지막 또는 마지막 shared_future
작업의 std::async
경우 소멸자가 작업이 완료되지 않은 경우 차단합니다. 즉, 이 스레드가 아직 호출 .get()
되지 않았거나 .wait()
작업이 계속 실행 중이면 차단됩니다. future
에서 가져온 std::async
가 로컬 범위 밖으로 이동되는 경우 해당 future를 사용하는 다른 코드는 공유 상태 준비를 위해 소멸자가 차단될 것을 알고 있어야 합니다.
의사 함수 INVOKE
는 .에 정의되어 있습니다 <functional>
.
Microsoft 전용
전달된 함수가 비동기적으로 실행되면 Windows 스레드 풀에서 실행됩니다. 자세한 내용은 스레드 풀을 참조 하세요. 동시 스레드 수는 스레드 풀 기본값인 500개 스레드로 제한됩니다.
Windows 11 및 Windows Server 2022 이전에는 애플리케이션이 기본적으로 논리 프로세서가 최대 64개인 단일 프로세서 그룹으로 제한되었습니다. 이렇게 하면 동시에 실행되는 스레드 수가 64개로 제한되었습니다. 자세한 내용은 프로세서 그룹을 참조 하세요.
Windows 11 및 Windows Server 2022부터 프로세스와 해당 스레드에는 기본적으로 시스템의 모든 프로세서와 64개 이상의 프로세서가 있는 컴퓨터의 여러 그룹에 걸쳐 있는 프로세서 친화성이 있습니다. 동시 스레드 수에 대한 제한은 이제 시스템의 총 논리 프로세서 수입니다.
future_category
future
개체와 연결된 오류의 특징을 결정하는 error_category
개체에 대한 참조를 반환합니다.
const error_category& future_category() noexcept;
make_error_code
future 오류의 특징을 결정하는 error_category 개체와 함께 error_code를 만듭니다.
inline error_code make_error_code(future_errc Errno) noexcept;
매개 변수
Errno
future_errc
보고된 오류를 식별하는 값입니다.
Return Value
error_code(static_cast<int>(Errno), future_category());
make_error_condition
error_condition
오류를 특징짓는 error_category
개체와 함께 만듭니다future
.
inline error_condition make_error_condition(future_errc Errno) noexcept;
매개 변수
Errno
future_errc
보고된 오류를 식별하는 값입니다.
Return Value
error_condition(static_cast<int>(Errno), future_category());
swap
promise
개체 하나의 연결된 비동기 상태를 다른 개체의 상태와 교환합니다.
template <class Ty>
void swap(promise<Ty>& Left, promise<Ty>& Right) noexcept;
template <class Ty, class... ArgTypes>
void swap(packaged_task<Ty(ArgTypes...)>& Left, packaged_task<Ty(ArgTypes...)>& Right) noexcept;
매개 변수
Left
왼쪽 promise
개체입니다.
Right
오른쪽 promise
개체입니다.