Compartilhar via


Classe Escolha

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 apelido de tipo para T.

Construtores públicos

Nome Descrição
choice Sobrecarregado. Constrói um bloco de mensagens choice.
~choice Destrutor 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 Adiciona uma contagem de referência neste bloco de mensagens choice para evitar a deleçã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 este bloco de mensagens choice já foi inicializado com um valor.
índice Retorna um índice no tuple que representa o elemento selecionado pelo bloco de mensagens choice.
link_target Vincula um bloco de destino a este bloco de mensagens choice.
lançamento 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. (Sobrescreve 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

ISource

choice

Requisitos

Cabeçalho: agents.h

Namespace: simultaneidade

aceitar

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

Adiciona uma contagem de referência neste bloco de mensagens choice para evitar a deleçã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
Um tuple de 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 é implicado pelo grupo de agendamento.

_Choice
Um bloco de mensagens choice do qual copiar. Observe que o objeto original é órfão, tornando-se um construtor de movimento.

Comentários

O runtime usará o agendador padrão se você não especificar os parâmetros _PScheduler ou _PScheduleGroup.

A movimentação de construção não é executada sob um bloqueio, o que significa que cabe ao usuário garantir que não haja tarefas leves em execução 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 método consume é semelhante a accept, mas deve ser sempre precedido por uma chamada para reserve que retornou true.

tem_valor

Verifica se este bloco de mensagens choice já foi inicializado com um valor.

bool has_value() const;

Valor de retorno

true se o bloco tiver recebido um valor; caso contrário, false.

indexar

Retorna um índice no 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.

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.

versão

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á para ser 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 sucesso; 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.

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.

Desvincula todos os destinos deste bloco de mensagens choice.

virtual void unlink_targets();

Comentários

Esse método não precisa ser chamado pelo destrutor porque o destrutor do bloco interno single_assignment será desvinculado corretamente.

valor

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 payload 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 concorrência
join Class
Classe single_assignment