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


Класс choice

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

Синтаксис

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

Параметры

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

Участники

Общедоступные typedefы

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

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

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

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

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

Замечания

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

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

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

ISource

choice

Требования

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

Пространство имен: конкурентность

принять

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

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

Параметры

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

_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_identitymessage объект.

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

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

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

Замечания

Метод consume аналогичен accept, но всегда должен использоваться после вызова reserve, который возвратил true.

has_value

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

bool has_value() const;

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

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

индекс

Возвращает индекс в 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
Указатель на ITarget блок, чтобы отменить связь с этим блоком choice обмена сообщениями.

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

virtual void unlink_targets();

Замечания

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

значение

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

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

Параметры

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

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

Полезная нагрузка сообщения.

Замечания

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

См. также

Пространство имен параллелизм
join-класс
Класс single_assignment