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 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

ISource

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 Devolução

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 Devolução

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 Devolução

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 Devolução

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.

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 Devolução

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.

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 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 Devolução

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