Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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 tupleque 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