Compartir a través de


funciones<future>

async
future_category
make_error_code
make_error_condition
swap|

async

Representa un proveedor asincrónico.

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);

Parámetros

policy
Valor launch.

Comentarios

Definiciones de las abreviaturas:

Abreviatura Descripción
dfn Resultado de llamar a decay_copy(forward<Fn>(fn)).
dargs Resultado de las llamadas decay_copy(forward<ArgsTypes>(args...)).
Ty El tipo de la clase result_of<Fn(ArgTypes...)>::type.

La primera función de plantilla devuelve async(launch::any, fn, args...).

La segunda función devuelve un objeto future<Ty> cuyo estado asincrónico asociado contiene un resultado junto con los valores de dfn y dargs y un objeto de subproceso para administrar un subproceso de ejecución independiente.

A menos que decay<Fn>::type sea un tipo distinto de launch, la segunda función no participa en la resolución de sobrecarga.

El estándar de C++ indica que si la directiva es launch::async, la función se comporta como si invoca el objeto invocable en un nuevo subproceso. Esto significa que, aunque normalmente resulta en la creación de un nuevo subproceso, la implementación puede usar otros mecanismos para lograr un comportamiento equivalente. Sin embargo, la implementación de Microsoft actualmente no se ajusta estrictamente a este comportamiento. Obtiene subprocesos de Windows ThreadPool, que puede proporcionar un subproceso reciclado en lugar de uno nuevo. Esto significa que la launch::async directiva se implementa eficazmente como launch::async|launch::deferred. Otra implicación de la implementación basada en ThreadPool es que no hay ninguna garantía de que las variables locales del subproceso se destruyen cuando se completa el subproceso. Si el subproceso se recicla y se proporciona a una nueva llamada a async, las variables antiguas siguen existiendo. Se recomienda evitar el uso de variables locales de subprocesos con async.

Si policy es launch::deferred, la función marca su estado asincrónico asociado como que contiene una función aplazada y vuelve. La primera llamada a cualquier función notimed que espere a que el estado asincrónico asociado esté listo en vigor llama a la función diferida mediante la evaluación INVOKE(dfn, dargs..., Ty)de .

En todos los casos, el estado asincrónico asociado del objeto future no se establece en listo hasta que la evaluación de INVOKE(dfn, dargs..., Ty) no se completa, ya sea iniciando una excepción o volviendo normalmente. El resultado del estado asincrónico asociado es una excepción si se produjo una o el valor que devuelve la evaluación.

Nota:

Para un future (o el último shared_future) adjunto a una tarea iniciada con std::async, el destructor se bloquea si la tarea no se ha completado; es decir, se bloquea si este subproceso aún no ha llamado a .get() o a .wait() y la tarea todavía se está ejecutando. Si un future obtenido de std::async se desplaza fuera del ámbito local, otro código que lo utilice debe saber que su destructor se puede bloquear para que el estado compartido se convierta en listo.

La pseudofunción INVOKE se define en <functional>.

Específico de Microsoft

Cuando la función pasada se ejecuta de forma asincrónica, se ejecuta en el grupo de subprocesos de Windows. Para obtener más información, consulte Grupos de subprocesos. El número de subprocesos simultáneos se limita al valor predeterminado del grupo de subprocesos, que es 500 subprocesos.

Antes de Windows 11 y Windows Server 2022, las aplicaciones estaban limitadas de forma predeterminada a un único grupo de procesadores que tenía como máximo 64 procesadores lógicos. Esto limita el número de subprocesos que se ejecutan simultáneamente a 64. Para obtener más información, consulte Grupos de procesadores.

A partir de Windows 11 y Windows Server 2022, los procesos y sus subprocesos tienen afinidades de procesador que, de forma predeterminada, abarcan todos los procesadores del sistema y en varios grupos de máquinas con más de 64 procesadores. El límite del número de subprocesos simultáneos es ahora el número total de procesadores lógicos del sistema.

future_category

Devuelve una referencia al objeto error_category que caracteriza los errores asociados a objetos future.

const error_category& future_category() noexcept;

make_error_code

Crea un error_code junto con el objeto error_category que caracteriza los errores de future.

inline error_code make_error_code(future_errc Errno) noexcept;

Parámetros

Errno
Valor future_errc que identifica el error notificado.

Valor devuelto

error_code(static_cast<int>(Errno), future_category());

make_error_condition

Crea un objeto error_condition junto con el error_category objeto que caracteriza los future errores.

inline error_condition make_error_condition(future_errc Errno) noexcept;

Parámetros

Errno
Valor future_errc que identifica el error notificado.

Valor devuelto

error_condition(static_cast<int>(Errno), future_category());

swap

Intercambia el estado asincrónico asociado de un objeto promise con el de otro.

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;

Parámetros

Left
Objeto promise izquierdo.

Right
Objeto promise derecho.

Consulte también

<future>