Share via


Clase choice

Un bloque de mensajería choice es un bloque de varios orígenes y de destino único que representa una interacción del flujo de control con un conjunto de orígenes. El bloque de elección esperará a cualquiera de los orígenes para generar un mensaje y propagará el índice del origen que generó el mensaje.

Sintaxis

template<
    class T
>
class choice: public ISource<size_t>;

Parámetros

T
Tipo basado en tuple que representa las cargas de los orígenes de entrada.

Miembros

Definiciones de tipos públicas

Nombre Descripción
type Alias de tipo para T.

Constructores públicos

Nombre Descripción
choice Con sobrecarga. Construye un bloque de mensajería choice .
Destructor ~choice Destruye el bloque de mensajería choice.

Métodos públicos

Nombre Descripción
accept Acepta un mensaje ofrecido por este bloque choice y transfiere la propiedad al autor de la llamada.
acquire_ref Adquiere un recuento de referencias en este bloque de mensajería choice para evitar la eliminación.
consumo Consume un mensaje ofrecido previamente por el bloque de mensajería choice y reservado correctamente por el destino, y transfiere la propiedad al autor de la llamada.
has_value Comprueba si este bloque de mensajería choice se ha inicializado con un valor.
índice Devuelve un índice en el tuple para representar el elemento seleccionado por el bloque de mensajería choice.
link_target Enlaza un bloque de destino a este bloque de mensajería choice.
release Libera una reserva de mensajes correcta anterior.
release_ref Libera un recuento de referencias en este bloque de mensajería choice.
reserve Reserva un mensaje ofrecido anteriormente por este bloque de mensajería choice.
unlink_target Desenlaza un bloque de destino de este bloque de mensajería choice.
unlink_targets Desenlaza todos los destinos de este bloque de mensajería choice. (Invalida ISource::unlink_targets.)
value Obtiene el mensaje cuyo índice se ha seleccionado mediante el bloque de mensajería choice.

Comentarios

El bloque de elección garantiza que solo se consuma uno de los mensajes entrantes.

Para obtener más información, consulte Bloques de mensajes asincrónicos.

Jerarquía de herencia

ISource

choice

Requisitos

Encabezado: agents.h

Espacio de nombres: simultaneidad

aceptar

Acepta un mensaje ofrecido por este bloque choice y transfiere la propiedad al autor de la llamada.

virtual message<size_t>* accept(
    runtime_object_identity _MsgId,
    _Inout_ ITarget<size_t>* _PTarget);

Parámetros

_MsgId
El valor runtime_object_identity del objeto message ofrecido.

_PTarget
Puntero al bloque de destino que está llamando al método accept.

Valor devuelto

Puntero al mensaje que ahora posee el autor de la llamada.

acquire_ref

Adquiere un recuento de referencias en este bloque de mensajería choice para evitar la eliminación.

virtual void acquire_ref(_Inout_ ITarget<size_t>* _PTarget);

Parámetros

_PTarget
Puntero al bloque de destino que llama a este método.

Comentarios

Un objeto ITarget que está vinculado a este origen llama a este método durante el método link_target.

opción

Construye un bloque de mensajería choice .

explicit choice(
    T _Tuple);

choice(
    Scheduler& _PScheduler,
    T _Tuple);

choice(
    ScheduleGroup& _PScheduleGroup,
    T _Tuple);

choice(
    choice&& _Choice);

Parámetros

_Tuple
tuple de orígenes para choice.

_PScheduler
El objeto Scheduler dentro del que se programa la tarea de propagación para el bloque de mensajería choice .

_PScheduleGroup
El objeto ScheduleGroup dentro del que se programa la tarea de propagación para el bloque de mensajería choice . El objeto Scheduler utilizado está implícito en el grupo de programación.

_Choice
Bloque de mensajería choice desde el que se realizará la copia. Tenga en cuenta que el objeto original es huérfano, por lo que este constructor pasa a ser de movimiento.

Comentarios

El runtime usa el programador predeterminado si no se especifican los parámetros _PScheduler o _PScheduleGroup .

La construcción de movimiento no se lleva acabo con un bloqueo, lo que significa que el usuario debe asegurarse de que no hay ninguna tarea ligera en marcha en el momento del movimiento. De lo contrario, se pueden producir numerosas carreras, que darán lugar a excepciones o a un estado incoherente.

~Elección

Destruye el bloque de mensajería choice.

~choice();

consumir

Consume un mensaje ofrecido previamente por el bloque de mensajería choice y reservado correctamente por el destino, y transfiere la propiedad al autor de la llamada.

virtual message<size_t>* consume(
    runtime_object_identity _MsgId,
    _Inout_ ITarget<size_t>* _PTarget);

Parámetros

_MsgId
runtime_object_identity del objeto message reservado.

_PTarget
Puntero al bloque de destino que está llamando al método consume.

Valor devuelto

Puntero al objeto message del que el autor de la llamada tiene ahora la propiedad.

Comentarios

El método consume es similar a accept, pero siempre debe ir precedido de una llamada a reserve que haya devuelto true.

has_value

Comprueba si este bloque de mensajería choice se ha inicializado con un valor.

bool has_value() const;

Valor devuelto

true si el bloque ha recibido un valor; de lo contrario, false.

índice

Devuelve un índice en el tuple para representar el elemento seleccionado por el bloque de mensajería choice.

size_t index();

Valor devuelto

Índice del mensaje.

Comentarios

La carga del mensaje se puede extraer mediante el método get.

Enlaza un bloque de destino a este bloque de mensajería choice.

virtual void link_target(_Inout_ ITarget<size_t>* _PTarget);

Parámetros

_PTarget
Puntero a un bloque ITarget que se enlazará a este bloque de mensajería choice.

release

Libera una reserva de mensajes correcta anterior.

virtual void release(
    runtime_object_identity _MsgId,
    _Inout_ ITarget<size_t>* _PTarget);

Parámetros

_MsgId
El valor runtime_object_identity del objeto message que se libera.

_PTarget
Puntero al bloque de destino que está llamando al método release.

release_ref

Libera un recuento de referencias en este bloque de mensajería choice.

virtual void release_ref(_Inout_ ITarget<size_t>* _PTarget);

Parámetros

_PTarget
Puntero al bloque de destino que llama a este método.

Comentarios

Un objeto ITarget que se desenlazará de este origen llama a este método. El bloque de origen se permite para liberar los recursos reservados para el bloque de destino.

reserva

Reserva un mensaje ofrecido anteriormente por este bloque de mensajería choice.

virtual bool reserve(
    runtime_object_identity _MsgId,
    _Inout_ ITarget<size_t>* _PTarget);

Parámetros

_MsgId
El runtime_object_identity del objeto message que se está reservando.

_PTarget
Puntero al bloque de destino que está llamando al método reserve.

Valor devuelto

true si se ha reservado correctamente el mensaje; de lo contrario, false. Las reservas pueden producir errores por muchas razones, como que el mensaje ya estaba reservado o aceptado por otro destino, que el origen deniegue reservas, etc.

Comentarios

Después de llamar a reserve, si no hay errores, debe llamar a consume o release para tomar la posesión del mensaje o renunciar a ella respectivamente.

Desenlaza un bloque de destino de este bloque de mensajería choice.

virtual void unlink_target(_Inout_ ITarget<size_t>* _PTarget);

Parámetros

_PTarget
Puntero a un bloque ITarget que se desenlazará de este bloque de mensajería choice.

Desenlaza todos los destinos de este bloque de mensajería choice.

virtual void unlink_targets();

Comentarios

No es necesario llamar a este método desde el destructor porque el destructor del bloque interno single_assignment se desenlazará correctamente.

value

Obtiene el mensaje cuyo índice se ha seleccionado mediante el bloque de mensajería choice.

template <
    typename _Payload_type
>
_Payload_type const& value();

Parámetros

_Payload_type
Tipo de carga del mensaje.

Valor devuelto

Carga del mensaje.

Comentarios

Dado que un bloque de mensajería choice puede tomar entradas con diferentes tipos de carga, debe especificar el tipo de carga en la recuperación. Puede determinar el tipo en función del resultado del método index.

Consulte también

concurrency (espacio de nombres)
join (clase)
single_assignment (clase)