다음을 통해 공유


<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스레드 지역 변수를 사용하지 않는 것이 좋습니다.

policylaunch::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 개체입니다.

참고 항목

<future>