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


Класс source_block

Класс source_block — это абстрактный базовый класс только для блоков источника. Класс предоставляет основные функции управления соединениями, а также проверки распространенных ошибок.

Синтаксис

template<class _TargetLinkRegistry, class _MessageProcessorType = ordered_message_processor<typename _TargetLinkRegistry::type::type>>
class source_block : public ISource<typename _TargetLinkRegistry::type::type>;

Параметры

_TargetLinkRegistry
Реестр ссылок, используемый для хранения целевых ссылок.

_MessageProcessorType
Тип процессора для обработки сообщений.

Участники

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

Имя Описание
target_iterator Итератор для обхода подключенных целевых объектов.

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

Имя Описание
source_block Формирует объект source_block.
Деструктор ~source_block Уничтожает source_block объект.

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

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

Защищенные методы

Имя Описание
accept_message При переопределении в производном классе принимает сообщение, предложенное источником. Блоки сообщений должны переопределить этот метод, чтобы проверить _MsgId и вернуть сообщение.
async_send Асинхронно помещает сообщения в очередь и запускает задачу распространения, если это еще не сделано.
consume_message При переопределении в производном классе использует сообщение, ранее зарезервированное.
включить_пакетную_обработку Активирует пакетную обработку для этого блока.
initialize_source Инициализирует message_propagator внутри этого source_block.
уведомление_о_цели_ссылки Обратный вызов, уведомляющий о том, что новый целевой объект связан с этим source_block объектом.
process_input_messages Обработка входных сообщений. Подходит только для блоков распространения, производных от source_block.
распространить_выходные_сообщения Распространять сообщения к целевым адресатам.
распространить_на_любые_цели При переопределении в производном классе распространяет данное сообщение на любые или все связанные целевые объекты. Это основная процедура передачи для блоков сообщений.
release_message При переопределении в производном классе освобождает ранее зарезервированное сообщение.
удалить_цели Удаляет все целевые ссылки для этого исходного блока. Это должно вызываться из деструктора.
reserve_message При переопределении в производном классе резервирует сообщение, ранее предлагаемое этим source_block объектом.
возобновить распространение При переопределении в производном классе возобновляется распространение после снятия резервирования.
sync_send Синхронно помещает сообщения в очередь и запускает задачу распространения, если это еще не сделано.
unlink_target_notification Обратный вызов, уведомляющий о том, что целевой объект не связывали с этим source_block объектом.
wait_for_outstanding_async_sends Ожидает завершения всех асинхронных распространений. В ожидании с вращением, зависящем от распространителя, используются деструкторы блоков сообщений, чтобы убедиться, что все асинхронные распространения успевают завершиться до уничтожения блока.

Замечания

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

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

ISource

source_block

Требования

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

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

принять

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

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

Параметры

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

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

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

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

Замечания

Метод выбрасывает исключение invalid_argument, если параметр _PTarget имеет значение NULL.

Метод accept вызывается этим целевым объектом, когда ISource блок предлагает сообщение. Указатель сообщения, который возвращается, может отличаться от того, который передан в метод propagate блока ITarget, если источник решит сделать копию сообщения.

принять_сообщение

При переопределении в производном классе принимает сообщение, предложенное источником. Блоки сообщений должны переопределить этот метод, чтобы проверить _MsgId и вернуть сообщение.

virtual message<_Target_type>* accept_message(runtime_object_identity _MsgId) = 0;

Параметры

_MsgId
Идентификатор объекта во время выполнения message.

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

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

Замечания

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

acquire_ref

Получает количество ссылок для этого source_block объекта, чтобы предотвратить удаление.

virtual void acquire_ref(_Inout_ ITarget<_Target_type> *);

Замечания

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

асинхронная_отправка

Асинхронно помещает сообщения в очередь и запускает задачу распространения, если это еще не сделано.

virtual void async_send(_Inout_opt_ message<_Target_type>* _Msg);

Параметры

_Msg
Указатель на объект, который необходимо отправить асинхронно message.

потреблять

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

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

Параметры

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

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

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

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

Замечания

Метод выбрасывает исключение invalid_argument, если параметр _PTarget имеет значение NULL.

Метод генерирует исключение bad_target, если параметр _PTarget не соответствует цели, вызвавшей reserve.

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

потребить_сообщение

При переопределении в производном классе использует сообщение, ранее зарезервированное.

virtual message<_Target_type>* consume_message(runtime_object_identity _MsgId) = 0;

Параметры

_MsgId
runtime_object_identity объекта message, который используется.

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

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

Замечания

Аналогично accept, но всегда вызывается после reserve.

включить_пакетную_обработку (enable_batched_processing)

Активирует пакетную обработку для этого блока.

void enable_batched_processing();

initialize_source

Инициализирует message_propagator внутри этого source_block.

void initialize_source(
    _Inout_opt_ Scheduler* _PScheduler = NULL,
    _Inout_opt_ ScheduleGroup* _PScheduleGroup = NULL);

Параметры

_PScheduler
Планировщик, используемый для планирования задач.

_PScheduleGroup
Группа расписаний, используемая для задач планирования.

Связывает целевой блок с этим source_block объектом.

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

Параметры

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

Замечания

Метод выбрасывает исключение invalid_argument, если параметр _PTarget имеет значение NULL.

Обратный вызов, уведомляющий о том, что новый целевой объект связан с этим source_block объектом.

virtual void link_target_notification(_Inout_ ITarget<_Target_type> *);

обработка_входящих_сообщений

Обработка входных сообщений. Подходит только для блоков распространения, производных от source_block.

virtual void process_input_messages(_Inout_ message<_Target_type>* _PMessage);

Параметры

_PMessage
Указатель на сообщение, которое необходимо обработать.

распространить_выходные_сообщения

Распространять сообщения к целевым адресатам.

virtual void propagate_output_messages();

распроcтранить_на_любые_цели

При переопределении в производном классе распространяет данное сообщение на любые или все связанные целевые объекты. Это основная процедура передачи для блоков сообщений.

virtual void propagate_to_any_targets(_Inout_opt_ message<_Target_type>* _PMessage);

Параметры

_PMessage
Указатель на сообщение, которое должно распространяться.

релиз

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

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

Параметры

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

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

Замечания

Метод выбрасывает исключение invalid_argument, если параметр _PTarget имеет значение NULL.

Метод генерирует исключение bad_target, если параметр _PTarget не соответствует цели, вызвавшей reserve.

сообщение о выпуске

При переопределении в производном классе освобождает ранее зарезервированное сообщение.

virtual void release_message(runtime_object_identity _MsgId) = 0;

Параметры

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

release_ref

Освобождает счетчик ссылок для этого source_block объекта.

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

Параметры

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

Замечания

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

удаление_целей

Удаляет все целевые ссылки для этого исходного блока. Это должно вызываться из деструктора.

void remove_targets();

резерв

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

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

Параметры

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

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

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

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

Замечания

Метод выбрасывает исключение invalid_argument, если параметр _PTarget имеет значение NULL.

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

сообщение_о_резервировании

При переопределении в производном классе резервирует сообщение, ранее предлагаемое этим source_block объектом.

virtual bool reserve_message(runtime_object_identity _MsgId) = 0;

Параметры

_MsgId
runtime_object_identity объекта message, который резервируется.

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

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

Замечания

После вызова reserve, если он возвращает true, должен быть вызван либо consume, либо release для принятия или освобождения владения сообщением.

возобновить_распространение

При переопределении в производном классе возобновляется распространение после снятия резервирования.

virtual void resume_propagation() = 0;

источник_блок

Формирует объект source_block.

source_block();

~source_block

Уничтожает source_block объект.

virtual ~source_block();

синхронная_отправка

Синхронно помещает сообщения в очередь и запускает задачу распространения, если это еще не сделано.

virtual void sync_send(_Inout_opt_ message<_Target_type>* _Msg);

Параметры

_Msg
Указатель на message объект для синхронной отправки.

Разрывает связь целевого блока с этим source_block объектом.

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

Параметры

_PTarget
Указатель на ITarget блок для разъединения с этим source_block объектом.

Замечания

Метод выбрасывает исключение invalid_argument, если параметр _PTarget имеет значение NULL.

Обратный вызов, уведомляющий о том, что целевой объект не связывали с этим source_block объектом.

virtual void unlink_target_notification(_Inout_ ITarget<_Target_type>* _PTarget);

Параметры

_PTarget
Блок ITarget, который был отсоединен.

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

virtual void unlink_targets();

wait_for_outstanding_async_sends

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

void wait_for_outstanding_async_sends();

См. также

Пространство имен параллелизм
Класс ISource