Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
O <future> cabeçalho fornece as seguintes funções:
async
Representa um provedor assíncrono.
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
Um valor de launch.
Observações
Definições das abreviaturas:
| Abreviatura | Descrição |
|---|---|
dfn |
O resultado da chamada decay_copy(forward<Fn>(fn)). |
dargs |
Os resultados dos convites à apresentação de propostas decay_copy(forward<ArgsTypes>(args...)). |
Ty |
O tipo result_of<Fn(ArgTypes...)>::type. |
A primeira função de modelo retorna async(launch::any, fn, args...).
A segunda função retorna um future<Ty> objeto cujo estado assíncrono associado contém um resultado junto com os valores de e dfn e um objeto de dargs thread para gerenciar um thread separado de execução.
A menos que decay<Fn>::type seja um tipo diferente do lançamento, a segunda função não participa da resolução de sobrecarga.
O padrão C++ afirma que, se a política for launch::async, a função se comportará como se invocasse o objeto chamável em um novo thread. Isso significa que, embora normalmente resulte na criação de um novo thread, a implementação pode usar outros mecanismos para obter um comportamento equivalente. No entanto, a implementação da Microsoft atualmente não está estritamente em conformidade com esse comportamento. Ele obtém threads do Windows ThreadPool, que pode fornecer um thread reciclado em vez de um novo. Isto significa que a política é efetivamente implementada launch::async como launch::async|launch::deferred. Outra implicação da implementação baseada em ThreadPool é que não há garantia de que as variáveis thread-local sejam destruídas quando o thread for concluído. Se o thread for reciclado e fornecido para uma nova chamada para async, as variáveis antigas ainda existirão. Recomendamos que você evite usar variáveis de thread-local com async.
Se policy for launch::deferred, a função marca seu estado assíncrono associado como mantendo uma função adiada e retorna. A primeira chamada para qualquer função não cronometrada que aguarda que o estado assíncrono associado esteja pronto de fato chama a função adiada avaliando INVOKE(dfn, dargs..., Ty).
Em todos os casos, o estado assíncrono associado do future objeto não é definido como pronto até que a avaliação seja INVOKE(dfn, dargs..., Ty) concluída, seja lançando uma exceção ou retornando normalmente. O resultado do estado assíncrono associado é uma exceção se um foi lançado, ou o valor que a avaliação retorna.
Observação
Para um future—ou o último shared_future—que está anexado a uma tarefa iniciada com std::async, o destruidor bloqueia se a tarefa não foi concluída, ou seja, bloqueia se esse thread ainda não foi chamado .get() ou .wait() e a tarefa ainda está em execução. Se um future obtido de for movido para fora do escopo local, outro código que o usa deve estar ciente de std::async que seu destruidor pode bloquear para que o estado compartilhado fique pronto.
A pseudo-função INVOKE é definida em <functional>.
específicos da Microsoft
Quando a função passada é executada de forma assíncrona, ela é executada no Pool de Threads do Windows. Para obter mais informações, consulte Pools de threads. O número de threads simultâneos é limitado ao padrão do pool de threads, que é de 500 threads.
Antes do Windows 11 e do Windows Server 2022, os aplicativos eram limitados por padrão a um único grupo de processadores com no máximo 64 processadores lógicos. Isso limitou o número de threads executados simultaneamente a 64. Para obter mais informações, consulte Grupos de processadores.
A partir do Windows 11 e do Windows Server 2022, os processos e seus threads têm afinidades de processador que, por padrão, abrangem todos os processadores do sistema e em vários grupos em máquinas com mais de 64 processadores. O limite no número de threads simultâneos é agora o número total de processadores lógicos no sistema.
future_category
Retorna uma referência ao error_category objeto que caracteriza erros associados a future objetos.
const error_category& future_category() noexcept;
make_error_code
Cria um error_code juntamente com o objeto error_category que caracteriza erros futuros .
inline error_code make_error_code(future_errc Errno) noexcept;
Parâmetros
Errno
Um future_errc valor que identifica o erro relatado.
Valor de retorno
error_code(static_cast<int>(Errno), future_category());
make_error_condition
Cria um error_condition junto com o error_category objeto que caracteriza future erros.
inline error_condition make_error_condition(future_errc Errno) noexcept;
Parâmetros
Errno
Um future_errc valor que identifica o erro relatado.
Valor de retorno
error_condition(static_cast<int>(Errno), future_category());
swap
Troca o estado assíncrono associado de um promise objeto com o de outro.
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
O objeto esquerdo promise .
Right
O objeto certo promise .