Classe choice
Um bloco de mensagens choice
é um bloco de destino único de várias fontes que representa uma interação de fluxo de controle com um conjunto de fontes. O bloco de escolha aguardará que qualquer uma das várias fontes produza uma mensagem e propagará o índice da origem que produziu a mensagem.
Sintaxe
template<
class T
>
class choice: public ISource<size_t>;
Parâmetros
T
Um tipo baseado em tuple
que representa os conteúdos das fontes de entrada.
Membros
Typedefs públicos
Nome | Descrição |
---|---|
type |
Um alias de tipo para T . |
Construtores públicos
Nome | Descrição |
---|---|
choice | Sobrecarregado. Constrói um bloco de mensagens choice . |
Destruidor ~choice | Destrói o bloco de mensagens choice . |
Métodos públicos
Nome | Descrição |
---|---|
accept | Aceita uma mensagem que foi oferecida por esse bloco choice , transferindo a propriedade para o chamador. |
acquire_ref | Adquire uma contagem de referência nesse bloco de mensagens choice para evitar a exclusão. |
consumir | Consome uma mensagem oferecida anteriormente por esse bloco de mensagens choice e reservada com êxito pelo destino, transferindo a propriedade para o chamador. |
has_value | Verifica se esse bloco de mensagens choice foi inicializado com um valor ainda. |
index | Retorna um índice para tuple que representa o elemento selecionado pelo bloco de mensagens choice . |
link_target | Vincula um bloco de destino a este bloco de mensagens choice . |
release | Libera uma reserva de mensagem anterior bem-sucedida. |
release_ref | Libera uma contagem de referências neste bloco de mensagens choice . |
reserve | Reserva uma mensagem oferecida anteriormente por este bloco de mensagens choice . |
unlink_target | Desvincula um bloco de destino deste bloco de mensagens choice . |
unlink_targets | Desvincula todos os destinos deste bloco de mensagens choice . (Substitui ISource::unlink_targets.) |
value | Obtém a mensagem cujo índice foi selecionado pelo bloco de mensagens choice . |
Comentários
O bloco de escolha garante que apenas uma das mensagens de entrada seja consumida.
Para mais informações, confira Blocos de mensagens assíncronas.
Hierarquia de herança
choice
Requisitos
Cabeçalho: agents.h
Namespace: concurrency
accept
Aceita uma mensagem que foi oferecida por esse bloco choice
, transferindo a propriedade para o chamador.
virtual message<size_t>* accept(
runtime_object_identity _MsgId,
_Inout_ ITarget<size_t>* _PTarget);
Parâmetros
_MsgId
O runtime_object_identity
do objeto message
oferecido.
_PTarget
Um ponteiro para o bloco de destino que está chamando o método accept
.
Valor de retorno
Um ponteiro para a mensagem da qual o chamador agora tem propriedade.
acquire_ref
Adquire uma contagem de referência nesse bloco de mensagens choice
para evitar a exclusão.
virtual void acquire_ref(_Inout_ ITarget<size_t>* _PTarget);
Parâmetros
_PTarget
Um ponteiro para o bloco de destino que está chamando esse método.
Comentários
Esse método é chamado por um objeto ITarget
que está sendo vinculado a essa fonte durante o método link_target
.
opção
Constrói um bloco de mensagens choice
.
explicit choice(
T _Tuple);
choice(
Scheduler& _PScheduler,
T _Tuple);
choice(
ScheduleGroup& _PScheduleGroup,
T _Tuple);
choice(
choice&& _Choice);
Parâmetros
_Tuple
Uma tuple
das fontes para a escolha.
_PScheduler
O objeto Scheduler
no qual a tarefa de propagação do bloco de mensagens choice
está agendada.
_PScheduleGroup
O objeto ScheduleGroup
no qual a tarefa de propagação do bloco de mensagens choice
está agendada. O objeto Scheduler
usado é implícito pelo grupo agendado.
_Choice
Um bloco de mensagens choice
do qual copiar. Observe que o objeto original é órfão, tornando-o um construtor de movimentação.
Comentários
O runtime usará o agendador padrão se você não especificar os parâmetros _PScheduler
ou _PScheduleGroup
.
A construção de movimentação não é executada sob um bloqueio, o que significa que cabe ao usuário garantir que não haja tarefas leves em voo no momento da movimentação. Caso contrário, várias corridas podem ocorrer, levando a exceções ou estado inconsistente.
~escolha
Destrói o bloco de mensagens choice
.
~choice();
consumir
Consome uma mensagem oferecida anteriormente por esse bloco de mensagens choice
e reservada com êxito pelo destino, transferindo a propriedade para o chamador.
virtual message<size_t>* consume(
runtime_object_identity _MsgId,
_Inout_ ITarget<size_t>* _PTarget);
Parâmetros
_MsgId
O runtime_object_identity
do objeto reservado message
.
_PTarget
Um ponteiro para o bloco de destino que está chamando o método consume
.
Valor de retorno
Um ponteiro para o objeto message
do qual o chamador agora tem propriedade.
Comentários
O consume
método é semelhante a accept
, mas deve ser sempre precedido por uma chamada para reserve
o retornado true
.
has_value
Verifica se esse bloco de mensagens choice
foi inicializado com um valor ainda.
bool has_value() const;
Valor de retorno
true
se o bloco tiver recebido um valor; caso contrário, false
.
índice
Retorna um índice para tuple
que representa o elemento selecionado pelo bloco de mensagens choice
.
size_t index();
Valor de retorno
O índice de mensagem.
Comentários
O conteúdo da mensagem pode ser extraído usando o método get
.
link_target
Vincula um bloco de destino a este bloco de mensagens choice
.
virtual void link_target(_Inout_ ITarget<size_t>* _PTarget);
Parâmetros
_PTarget
Um ponteiro para um bloco ITarget
para vincular a esse bloco de mensagens choice
.
release
Libera uma reserva de mensagem anterior bem-sucedida.
virtual void release(
runtime_object_identity _MsgId,
_Inout_ ITarget<size_t>* _PTarget);
Parâmetros
_MsgId
O runtime_object_identity
do objeto message
que está sendo liberado.
_PTarget
Um ponteiro para o bloco de destino que está chamando o método release
.
release_ref
Libera uma contagem de referências neste bloco de mensagens choice
.
virtual void release_ref(_Inout_ ITarget<size_t>* _PTarget);
Parâmetros
_PTarget
Um ponteiro para o bloco de destino que está chamando esse método.
Comentários
Esse método é chamado por um objeto ITarget
que está sendo desvinculado dessa fonte. O bloco de origem tem permissão para liberar todos os recursos reservados para o bloco de destino.
reserve
Reserva uma mensagem oferecida anteriormente por este bloco de mensagens choice
.
virtual bool reserve(
runtime_object_identity _MsgId,
_Inout_ ITarget<size_t>* _PTarget);
Parâmetros
_MsgId
O runtime_object_identity
do objeto message
que está sendo reservado.
_PTarget
Um ponteiro para o bloco de destino que está chamando o método reserve
.
Valor de retorno
true
se a mensagem foi reservada com êxito; caso contrário, false
. As reservas podem falhar por muitos motivos, incluindo: a mensagem já foi reservada ou aceita por outro destino, a origem pode negar reservas etc.
Comentários
Depois de chamar reserve
, se tiver êxito, você deverá chamar consume
ou release
para assumir ou conceder a posse da mensagem, respectivamente.
unlink_target
Desvincula um bloco de destino deste bloco de mensagens choice
.
virtual void unlink_target(_Inout_ ITarget<size_t>* _PTarget);
Parâmetros
_PTarget
Um ponteiro para um bloco ITarget
a ser desvinculado desse bloco de mensagens choice
.
unlink_targets
Desvincula todos os destinos deste bloco de mensagens choice
.
virtual void unlink_targets();
Comentários
Esse método não precisa ser chamado do destruidor porque o destruidor do bloco interno single_assignment
será desvinculado corretamente.
value
Obtém a mensagem cujo índice foi selecionado pelo bloco de mensagens choice
.
template <
typename _Payload_type
>
_Payload_type const& value();
Parâmetros
_Payload_type
O tipo de conteúdo da mensagem.
Valor de retorno
A carga útil da mensagem.
Comentários
Como um bloco de mensagens choice
pode receber entradas com diferentes tipos de conteúdo, você deve especificar o tipo de conteúdo no ponto de recuperação. Você pode determinar o tipo com base no resultado do método index
.
Confira também
Namespace de simultaneidade
Classe join
Classe single_assignment