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
메시지 처리를 위한 프로세서 유형입니다.

멤버

공용 Typedefs

이름 설명
target_iterator 연결된 대상을 걸을 반복기입니다.

공용 생성자

속성 설명
source_block source_block 개체를 생성합니다.
~source_block 소멸자 개체를 source_block 삭제합니다.

공용 메서드

이름 설명
받아들일 source_block 개체에서 제공한 메시지를 수락하여 소유권을 호출자에게 전송합니다.
acquire_ref 삭제를 방지하기 위해 이 source_block 개체에 대한 참조 횟수를 가져옵니다.
소비 이전에 이 source_block 개체에서 제공한 메시지를 사용하고 대상에서 성공적으로 예약하여 소유권을 호출자에게 전송합니다.
link_target 대상 블록을 이 source_block 개체에 연결합니다.
release 이전에 성공한 메시지 예약을 해제합니다.
release_ref source_block 개체에 대한 참조 횟수를 해제합니다.
reserve source_block 개체에서 이전에 제공한 메시지를 예약합니다.
unlink_target source_block 개체에서 대상 블록의 연결을 해제합니다.
unlink_targets source_block 개체에서 모든 대상 블록의 연결을 해제합니다. (재정의 ISource::unlink_targets.)

보호된 메서드

속성 설명
accept_message 파생 클래스에서 재정의되는 경우 소스에서 제공하는 메시지를 수락합니다. 메시지 블록은 메시지의 유효성을 검사하고 반환하기 위해 이 메서드를 재정의 _MsgId 해야 합니다.
async_send 메시지를 비동기적으로 큐에 대기시키고 전파 작업을 시작합니다(아직 수행되지 않은 경우).
consume_message 파생 클래스에서 재정의된 경우 이전에 예약된 메시지를 사용합니다.
enable_batched_processing 이 블록에 대한 일괄 처리를 할 수 있도록 합니다.
initialize_source source_block내에서 초기화합니다message_propagator.
link_target_notification 새 대상이 이 source_block 개체에 연결되었음을 나타내는 콜백입니다.
process_input_messages 입력된 메시지를 처리합니다. source_block에서 파생되는 전파자 블록에만 유용합니다.
propagate_output_messages 메시지를 대상으로 전파합니다.
propagate_to_any_targets 파생 클래스에서 재정의된 경우 지정된 메시지를 연결된 대상의 모든 또는 전부에 전파합니다. 이는 메시지 블록에 대한 기본 전파 루틴입니다.
release_message 파생 클래스에서 재정의된 경우 이전 메시지 예약을 해제합니다.
remove_targets 이 소스 블록에 대한 모든 대상 링크를 제거합니다. 소멸자에서 호출해야 합니다.
reserve_message 파생 클래스에서 재정의된 경우 이 source_block 개체에서 이전에 제공한 메시지를 예약합니다.
resume_propagation 파생 클래스에서 재정의된 경우 예약이 해제된 후 전파를 다시 시작합니다.
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_identity 제공 message 된 개체의 개체입니다.

_PTarget
메서드를 호출하는 대상 블록에 대한 accept 포인터입니다.

Return Value

호출자의 소유권이 message 있는 개체에 대한 포인터입니다.

설명

매개 변수가 있는 경우 메서드는 invalid_argument 예외를 throw합니다NULL._PTarget

acceptISource 블록에서 메시지를 제공하는 동안 대상에서 메서드를 호출합니다. 반환된 메시지 포인터는 이 소스가 메시지의 복사본을 만들기로 propagate 결정하는 경우 블록의 ITarget 메서드에 전달된 것과 다를 수 있습니다.

accept_message

파생 클래스에서 재정의되는 경우 소스에서 제공하는 메시지를 수락합니다. 메시지 블록은 메시지의 유효성을 검사하고 반환하기 위해 이 메서드를 재정의 _MsgId 해야 합니다.

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

매개 변수

_MsgId
개체의 런타임 개체 ID입니다 message .

Return Value

이제 호출자의 소유권이 있는 메시지에 대한 포인터입니다.

설명

소유권을 이전하려면 원래 메시지 포인터를 반환해야 합니다. 소유권을 기본 위해 메시지 페이로드의 복사본을 만들고 반환해야 합니다.

acquire_ref

삭제를 방지하기 위해 이 source_block 개체에 대한 참조 횟수를 가져옵니다.

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

설명

이 메서드는 메서드 중에 link_target 이 원본에 연결된 개체에 의해 ITarget 호출됩니다.

async_send

메시지를 비동기적으로 큐에 대기시키고 전파 작업을 시작합니다(아직 수행되지 않은 경우).

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

매개 변수

_메시지
비동기 message 적으로 보낼 개체에 대한 포인터입니다.

소비

이전에 이 source_block 개체에서 제공한 메시지를 사용하고 대상에서 성공적으로 예약하여 소유권을 호출자에게 전송합니다.

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

매개 변수

_MsgId
runtime_object_identity 예약된 message 개체의 개체입니다.

_PTarget
메서드를 호출하는 대상 블록에 대한 consume 포인터입니다.

Return Value

호출자의 소유권이 message 있는 개체에 대한 포인터입니다.

설명

매개 변수가 있는 경우 메서드는 invalid_argument 예외를 throw합니다NULL._PTarget

매개 변수 _PTarget 가 호출reserve된 대상을 나타내지 않으면 메서드는 bad_target 예외를 throw합니다.

메서드 consume 는 유사accept하지만 항상 반환true된 메서드에 대한 reserve 호출 앞에 있어야 합니다.

consume_message

파생 클래스에서 재정의된 경우 이전에 예약된 메시지를 사용합니다.

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

매개 변수

_MsgId
runtime_object_identity 사용 중인 개체의 message 개체입니다.

Return Value

이제 호출자의 소유권이 있는 메시지에 대한 포인터입니다.

설명

accept유사하지만 항상 호출 앞에 있습니다 reserve.

enable_batched_processing

이 블록에 대한 일괄 처리를 할 수 있도록 합니다.

void enable_batched_processing();

initialize_source

source_block내에서 초기화합니다message_propagator.

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
source_block 개체에 ITarget 연결할 블록에 대한 포인터입니다.

설명

매개 변수가 있는 경우 메서드는 invalid_argument 예외를 throw합니다NULL._PTarget

새 대상이 이 source_block 개체에 연결되었음을 나타내는 콜백입니다.

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

process_input_messages

입력된 메시지를 처리합니다. source_block에서 파생되는 전파자 블록에만 유용합니다.

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

매개 변수

_PMessage
처리할 메시지에 대한 포인터입니다.

propagate_output_messages

메시지를 대상으로 전파합니다.

virtual void propagate_output_messages();

propagate_to_any_targets

파생 클래스에서 재정의된 경우 지정된 메시지를 연결된 대상의 모든 또는 전부에 전파합니다. 이는 메시지 블록에 대한 기본 전파 루틴입니다.

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_identity 예약된 message 개체의 개체입니다.

_PTarget
메서드를 호출하는 대상 블록에 대한 release 포인터입니다.

설명

매개 변수가 있는 경우 메서드는 invalid_argument 예외를 throw합니다NULL._PTarget

매개 변수 _PTarget 가 호출reserve된 대상을 나타내지 않으면 메서드는 bad_target 예외를 throw합니다.

release_message

파생 클래스에서 재정의된 경우 이전 메시지 예약을 해제합니다.

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 호출됩니다. 원본 블록은 대상 블록에 예약된 모든 리소스를 해제할 수 있습니다.

remove_targets

이 소스 블록에 대한 모든 대상 링크를 제거합니다. 소멸자에서 호출해야 합니다.

void remove_targets();

reserve

source_block 개체에서 이전에 제공한 메시지를 예약합니다.

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

매개 변수

_MsgId
runtime_object_identity 제공 message 된 개체의 개체입니다.

_PTarget
메서드를 호출하는 대상 블록에 대한 reserve 포인터입니다.

Return Value

true 메시지가 성공적으로 예약 false 되었으면 그렇지 않습니다. 예약은 메시지를 이미 다른 대상이 예약했거나 수락한 경우, 소스에서 예약을 거부한 경우 등과 같은 다양한 이유로 실패할 수 있습니다.

설명

매개 변수가 있는 경우 메서드는 invalid_argument 예외를 throw합니다NULL._PTarget

호출reserve한 후 성공하는 경우 메시지의 소유를 각각 취하거나 release 포기하기 위해 호출 consume 해야 합니다.

reserve_message

파생 클래스에서 재정의된 경우 이 source_block 개체에서 이전에 제공한 메시지를 예약합니다.

virtual bool reserve_message(runtime_object_identity _MsgId) = 0;

매개 변수

_MsgId
runtime_object_identity 예약 중인 개체의 message 개체입니다.

Return Value

true 메시지가 성공적으로 예약 false 되었으면 그렇지 않습니다.

설명

호출된 후 reserve 반환 trueconsume 되는 경우 메시지의 소유권을 취하거나 release 해제하기 위해 호출해야 합니다.

resume_propagation

파생 클래스에서 재정의된 경우 예약이 해제된 후 전파를 다시 시작합니다.

virtual void resume_propagation() = 0;

source_block

source_block 개체를 생성합니다.

source_block();

~source_block

개체를 source_block 삭제합니다.

virtual ~source_block();

sync_send

메시지를 동기적으로 큐에 대기시키고 전파 작업을 시작합니다(아직 수행되지 않은 경우).

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

매개 변수

_메시지
동기적으로 보낼 개체에 대한 포인터 message 입니다.

source_block 개체에서 대상 블록의 연결을 해제합니다.

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

매개 변수

_PTarget
source_block 개체에서 연결을 해제할 블록에 대한 포인터 ITarget 입니다.

설명

매개 변수가 있는 경우 메서드는 invalid_argument 예외를 throw합니다NULL._PTarget

대상이 이 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();

참고 항목

concurrency 네임스페이스
ISource 클래스