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