Classe packaged_task
Descreve um provedor assíncrono que é um wrapper de chamada e cuja assinatura de chamada é Ty(ArgTypes...)
. O estado assíncrono associado mantém uma cópia de seu objeto que pode ser chamado, bem como o possível resultado.
Sintaxe
template <class>
class packaged_task;
Membros
Construtores públicos
Nome | Descrição |
---|---|
packaged_task | Constrói um objeto packaged_task . |
Destruidor packaged_task::~packaged_task | Destrói um objeto packaged_task . |
Métodos públicos
Nome | Descrição |
---|---|
get_future | Retorna um objeto future que tem o mesmo estado assíncrono associado. |
make_ready_at_thread_exit | Chama o objeto callable que é armazenado no estado assíncrono associado e armazena atomicamente o valor retornado. |
reset | Substitui o estado assíncrono associado. |
troca | Troca o estado assíncrono associado por um objeto especificado. |
valid | Especifica se o objeto tem um estado assíncrono associado. |
Operadores públicos
Nome | Descrição |
---|---|
packaged_task::operator= | Transfere o estado assíncrono associado de um objeto especificado. |
packaged_task::operator() | Chama o objeto callable que é armazenado no estado assíncrono associado, armazena atomicamente o valor retornado e define o estado como ready. |
packaged_task::operator bool | Especifica se o objeto tem um estado assíncrono associado. |
Requisitos
Cabeçalho:<future>
Namespace: std
packaged_task::get_future
Retorna um objeto do tipo future<Ty>
que tem o mesmo estado assíncrono associado.
future<Ty> get_future();
Comentários
Se o objeto packaged_task
não tiver nenhum estado assíncrono associado, esse método gerará um future_error com código de erro no_state
.
Se esse método já foi chamado para um objeto packaged_task
que tem o mesmo estado assíncrono associado, o método gerará um future_error
com código de erro future_already_retrieved
.
packaged_task::make_ready_at_thread_exit
Chama o objeto callable que é armazenado no estado assíncrono associado e armazena atomicamente o valor retornado.
void make_ready_at_thread_exit(ArgTypes... args);
Comentários
Se o objeto packaged_task
não tiver nenhum estado assíncrono associado, esse método gerará um future_error com código de erro no_state
.
Se este método ou make_ready_at_thread_exit já tiver sido chamado para um objeto packaged_task
que tem o mesmo estado assíncrono associado, esse método gera um future_error
com código de erro promise_already_satisfied
.
Caso contrário, este operador chama INVOKE(fn, args..., Ty)
, em que fn é o objeto callable que é armazenado no estado assíncrono associado. Qualquer valor retornado é armazenado automaticamente como o resultado retornado do estado assíncrono associado.
Em comparação com packaged_task::operator(), o estado assíncrono associado só é definido como ready
depois que todos os objetos thread-local no thread de chamada são destruídos. Normalmente, threads bloqueados no estado assíncrono associado não são desbloqueados até que o thread de chamada seja encerrado.
packaged_task::operator=
Transfere o estado assíncrono associado de um objeto especificado.
packaged_task& operator=(packaged_task&& Right);
Parâmetros
Right
Um objeto packaged_task
.
Valor de retorno
*this
Comentários
Após a operação, Right não tem mais um estado assíncrono associado.
packaged_task::operator()
Chama o objeto callable que é armazenado no estado assíncrono associado, armazena atomicamente o valor retornado e define o estado como ready.
void operator()(ArgTypes... args);
Comentários
Se o objeto packaged_task
não tiver nenhum estado assíncrono associado, esse método gerará um future_error com código de erro no_state
.
Se este método ou make_ready_at_thread_exit já tiver sido chamado para um objeto packaged_task
que tem o mesmo estado assíncrono associado, esse método gera um future_error
com código de erro promise_already_satisfied
.
Caso contrário, este operador chama INVOKE(fn, args..., Ty)
, em que fn é o objeto callable que é armazenado no estado assíncrono associado. Qualquer valor retornado é armazenado atomicamente como o resultado retornado do estado assíncrono associado e o estado é definido como ready. Como resultado, os threads bloqueados no estado assíncrono associado são desbloqueados.
packaged_task::operator bool
Especifica se o objeto tem um associated asynchronous state
.
operator bool() const noexcept;
Valor de retorno
true
se o objeto tiver um estado assíncrono associado; caso contrário, false
.
Construtor packaged_task::packaged_task
Constrói um objeto packaged_task
.
packaged_task() noexcept;
packaged_task(packaged_task&& Right) noexcept;
template <class Fn>
explicit packaged_task(Fn&& fn);
template <class Fn, class Alloc>
explicit packaged_task(
allocator_arg_t, const Alloc& alloc, Fn&& fn);
Parâmetros
Right
Um objeto packaged_task
.
alloc
Um alocador de memória. Para obter mais informações, confira <allocators>.
fn
Um objeto de função.
Comentários
O primeiro construtor cria um objeto packaged_task
que não tem nenhum estado assíncrono associado.
O segundo construtor cria um objeto packaged_task
e transfere o estado assíncrono associado de Right. Após a operação, Right não tem mais um estado assíncrono associado.
O terceiro construtor cria um objeto packaged_task
que tem uma cópia de fn armazenada em seu estado assíncrono associado.
O quarto construtor cria um objeto packaged_task
que tem uma cópia de fn armazenada em seu estado assíncrono associado e usa alloc
para alocação de memória.
Destruidor packaged_task::~packaged_task
Destrói um objeto packaged_task
.
~packaged_task();
Comentários
Se o estado assíncrono associado não estiver ready, o destruidor armazena uma exceção future_error com um código de erro de broken_promise
como resultado no estado assíncrono associado e os threads bloqueados no estado assíncrono associado são desbloqueados.
packaged_task::reset
Usa um novo estado assíncrono associado para substituir o estado assíncrono associado existente.
void reset();
Comentários
Na verdade, esse método executa *this = packaged_task(move(fn))
, em que fn é o objeto de função que é armazenado no estado assíncrono associado a este objeto. Portanto, o estado do objeto é desmarcado e get_future, operator() e make_ready_at_thread_exit podem ser chamados como se estivesse em um objeto recém-criado.
packaged_task::swap
Troca o estado assíncrono associado por um objeto especificado.
void swap(packaged_task& Right) noexcept;
Parâmetros
Right
Um objeto packaged_task
.
packaged_task::valid
Especifica se o objeto tem um associated asynchronous state
.
bool valid() const;
Valor de retorno
true
se o objeto tiver um estado assíncrono associado; caso contrário, false
.