Поделиться через


Класс choice

Блок обмена сообщениями choice — это блок с несколькими источниками и одной целью, который представляет взаимодействие потока управления с набором источников. Блок choice будет ожидать доступа к любому из нескольких источников для создания сообщения и распространит индекс источника, создавшего сообщение.

Синтаксис

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

Параметры

T
Тип tupleна основе, представляющий полезные данные входных источников.

Участники

Общедоступные определения типов

Имя Описание
type Псевдоним типа для T.

Открытые конструкторы

Имя Описание
choice Перегружен. Создает блок обмена сообщениями choice .
Деструктор ~choice Уничтожает choice блок обмена сообщениями.

Открытые методы

Имя Описание
принимать Принимает сообщение, которое было предложено этим choice блоком, передавая владение вызывающему объекту.
acquire_ref Получает количество ссылок в этом choice блоке обмена сообщениями, чтобы предотвратить удаление.
consume Использует сообщение, ранее предлагаемое этим choice блоком обмена сообщениями, и успешно зарезервировано целевым объектом, передавая владельца вызывающему объекту.
has_value Проверяет, инициализирован ли этот choice блок обмена сообщениями со значением.
index Возвращает индекс в tuple представление элемента, выбранного блоком choice обмена сообщениями.
link_target Связывает целевой блок с этим choice блоком обмена сообщениями.
release Освобождает предыдущее успешное резервирование сообщений.
release_ref Освобождает количество ссылок в этом choice блоке обмена сообщениями.
reserve Резервирует сообщение, ранее предлагаемое этим choice блоком обмена сообщениями.
unlink_target Отменяет связь целевого блока из этого choice блока обмена сообщениями.
unlink_targets Отменяет связь всех целевых объектов из этого choice блока обмена сообщениями. (Переопределения ISource::unlink_targets.)
значение Возвращает сообщение, индекс которого был выбран блоком choice обмена сообщениями.

Замечания

Блок выбора гарантирует, что используется только один из входящих сообщений.

Дополнительные сведения см. в разделе "Блоки асинхронных сообщений".

Иерархия наследования

ISource

choice

Требования

Заголовок: agents.h

Пространство имен: concurrency

accept

Принимает сообщение, которое было предложено этим choice блоком, передавая владение вызывающему объекту.

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

Параметры

_MsgId
Предлагаемый runtime_object_identity message объект.

_PTarget
Указатель на целевой блок, вызывающий accept метод.

Возвращаемое значение

Указатель на сообщение о том, что вызывающий объект теперь имеет право владения.

acquire_ref

Получает количество ссылок в этом choice блоке обмена сообщениями, чтобы предотвратить удаление.

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

Параметры

_PTarget
Указатель на целевой блок, вызывающий этот метод.

Замечания

Этот метод вызывается ITarget объектом, связанным с этим источником во время link_target метода.

вариант

Создает блок обмена сообщениями choice .

explicit choice(
    T _Tuple);

choice(
    Scheduler& _PScheduler,
    T _Tuple);

choice(
    ScheduleGroup& _PScheduleGroup,
    T _Tuple);

choice(
    choice&& _Choice);

Параметры

_Кортеж
Объект tuple источников по выбору.

_PScheduler
Объект Scheduler , в котором запланирована задача распространения для блока обмена сообщениями choice .

_PScheduleGroup
Объект ScheduleGroup , в котором запланирована задача распространения для блока обмена сообщениями choice . Используемый объект Scheduler подразумевается группой расписаний.

_Выбор
Блок обмена сообщениями choice , из которого выполняется копирование. Обратите внимание, что исходный объект становится потерянным, превращая этот конструктор в конструктор перемещения.

Замечания

Среда выполнения использует планировщик по умолчанию, если вы не указали параметры _PScheduler или _PScheduleGroup .

Конструкция перемещения не выполняется при блокировке. Это означает, что пользователь должен убедиться в отсутствии простых задач во время перемещения. В противном случае могут возникнуть многочисленные гонки, приводящие к исключениям или недопустимому состоянию.

~выбор

Уничтожает choice блок обмена сообщениями.

~choice();

использовать

Использует сообщение, ранее предлагаемое этим choice блоком обмена сообщениями, и успешно зарезервировано целевым объектом, передавая владельца вызывающему объекту.

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

Параметры

_MsgId
Зарезервированный runtime_object_identity message объект.

_PTarget
Указатель на целевой блок, вызывающий consume метод.

Возвращаемое значение

Указатель на объект, на который вызывающий message объект теперь имеет право владения.

Замечания

Метод consume аналогичен accept, но всегда должен предшествовать вызову reserve возвращаемого true.

has_value

Проверяет, инициализирован ли этот choice блок обмена сообщениями со значением.

bool has_value() const;

Возвращаемое значение

true Значение, если блок получил значение, false в противном случае.

index

Возвращает индекс в tuple представление элемента, выбранного блоком choice обмена сообщениями.

size_t index();

Возвращаемое значение

Индекс сообщения.

Замечания

Полезные данные сообщения можно извлечь с помощью get метода.

Связывает целевой блок с этим choice блоком обмена сообщениями.

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

Параметры

_PTarget
Указатель на блок для ссылки на ITarget этот choice блок обмена сообщениями.

выпуска

Освобождает предыдущее успешное резервирование сообщений.

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

Параметры

_MsgId
Объект runtime_object_identity , message который освобождается.

_PTarget
Указатель на целевой блок, вызывающий release метод.

release_ref

Освобождает количество ссылок в этом choice блоке обмена сообщениями.

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

Параметры

_PTarget
Указатель на целевой блок, вызывающий этот метод.

Замечания

Этот метод вызывается ITarget объектом, который не связан с этим источником. Исходный блок может освободить все ресурсы, зарезервированные для целевого блока.

резерв

Резервирует сообщение, ранее предлагаемое этим choice блоком обмена сообщениями.

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

Параметры

_MsgId
Зарезервированный runtime_object_identity message объект.

_PTarget
Указатель на целевой блок, вызывающий reserve метод.

Возвращаемое значение

true Значение , если сообщение успешно зарезервировано, false в противном случае. Резервирования могут завершаться неудачей по ряду причин, включая следующие: сообщение уже было зарезервировано или принято другим целевым объектом, источник может отклонять резервирования и т. п.

Замечания

После вызова reserve, если оно выполнено успешно, необходимо вызвать либо consume либо release , чтобы принять или отказаться от владения сообщением соответственно.

Отменяет связь целевого блока из этого choice блока обмена сообщениями.

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

Параметры

_PTarget
Указатель на блок для отмены связи с этим choice блоком ITarget обмена сообщениями.

Отменяет связь всех целевых объектов из этого choice блока обмена сообщениями.

virtual void unlink_targets();

Замечания

Этот метод не требуется вызывать из деструктора, так как деструктор для внутреннего single_assignment блока не будет правильно связаться.

значение

Возвращает сообщение, индекс которого был выбран блоком choice обмена сообщениями.

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

Параметры

_Payload_type
Тип полезных данных сообщения.

Возвращаемое значение

Полезные данные сообщения.

Замечания

Поскольку блок сообщений choice может принимать входные данные с различными типами полезной нагрузки, необходимо указать тип полезной нагрузки в момент извлечения. Тип можно определить на основе результата index метода.

См. также

Пространство имен concurrency
Класс join
Класс single_assignment