Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Блок обмена сообщениями 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 обмена сообщениями. |
Замечания
Блок выбора гарантирует, что используется только один из входящих сообщений.
Дополнительные сведения см. в разделе "Блоки асинхронных сообщений".
Иерархия наследования
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 метода.
link_target
Связывает целевой блок с этим 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 обмена сообщениями.
unlink_targets
Отменяет связь всех целевых объектов из этого choice блока обмена сообщениями.
virtual void unlink_targets();
Замечания
Этот метод не требуется вызывать из деструктора, так как деструктор для внутреннего single_assignment блока не будет правильно связаться.
значение
Возвращает сообщение, индекс которого был выбран блоком choice обмена сообщениями.
template <
typename _Payload_type
>
_Payload_type const& value();
Параметры
_Payload_type
Тип полезных данных сообщения.
Возвращаемое значение
Полезная нагрузка сообщения.
Замечания
Поскольку блок сообщений choice может принимать входные данные с различными типами полезной нагрузки, необходимо указать тип полезной нагрузки в момент извлечения. Тип можно определить на основе результата index метода.
См. также
Пространство имен параллелизм
join-класс
Класс single_assignment