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 Destructor source_block オブジェクトを破棄します。

パブリック メソッド

名前 説明
accept この 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

名前空間: concurrency

accept

この source_block オブジェクトから提供されたメッセージを受け入れ、所有権を呼び出し元に譲渡します。

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

パラメーター

_MsgId
提供された message オブジェクトの runtime_object_identity

_PTarget
accept メソッドを呼び出しているターゲット ブロックへのポインター。

戻り値

現在呼び出し元が所有権を持っている message オブジェクトへのポインター。

解説

パラメーター _PTargetNULL である場合に、メソッドは invalid_argument 例外をスローします。

この ISource ブロックによってメッセージが提供されている間に、accept メソッドがターゲットによって呼び出されます。 このソースがメッセージのコピーを作成する場合、返されるメッセージ ポインターは、ITarget ブロックの propagate メソッドに渡されるメッセージ ポインターとは異なる場合があります。

accept_message

派生クラスでオーバーライドされる際、ソースによって提供されるメッセージを受け入れます。 メッセージ ブロックは、このメソッドをオーバーライドして _MsgId を検証し、メッセージを返す必要があります。

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

パラメーター

_MsgId
message オブジェクトのランタイム オブジェクト ID。

戻り値

現在呼び出し元が所有権を持っているメッセージへのポインター。

解説

所有権を譲渡するには、元のメッセージ ポインターを返す必要があります。 所有権を維持するには、メッセージ ペイロードのコピーを作成して返す必要があります。

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);

パラメーター

_Msg
非同期的に送信する message オブジェクトへのポインター。

消費

この source_block オブジェクトから過去に提供され、ターゲットによって正常に予約されているメッセージを使用して、所有権を呼び出し元に譲渡します。

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

パラメーター

_MsgId
予約された message オブジェクトの runtime_object_identity

_PTarget
consume メソッドを呼び出しているターゲット ブロックへのポインター。

戻り値

現在呼び出し元が所有権を持っている message オブジェクトへのポインター。

解説

パラメーター _PTargetNULL である場合に、メソッドは invalid_argument 例外をスローします。

パラメーター _PTargetreserve を呼び出していない場合、メソッドは bad_target 例外をスローします。

consume メソッドは accept に似ていますが、必ず、このメソッドの前に reserve の呼び出しで true が返されている必要があります。

consume_message

派生クラスでオーバーライドされると、以前に予約されたメッセージを使用します。

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

パラメーター

_MsgId
使用されている message オブジェクトの runtime_object_identity

戻り値

現在呼び出し元が所有権を持っているメッセージへのポインター。

解説

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 ブロックへのポインター。

解説

パラメーター _PTargetNULL である場合に、メソッドは invalid_argument 例外をスローします。

この 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
伝達するメッセージへのポインター。

release

以前に成功したメッセージの予約を解除します。

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

パラメーター

_MsgId
予約された message オブジェクトの runtime_object_identity

_PTarget
release メソッドを呼び出しているターゲット ブロックへのポインター。

解説

パラメーター _PTargetNULL である場合に、メソッドは invalid_argument 例外をスローします。

パラメーター _PTargetreserve を呼び出していない場合、メソッドは bad_target 例外をスローします。

release_message

派生クラスでオーバーライドされると、以前のメッセージ予約を解放します。

virtual void release_message(runtime_object_identity _MsgId) = 0;

パラメーター

_MsgId
解放する message オブジェクトの runtime_object_identity

release_ref

この source_block オブジェクトの参照カウントを解放します。

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

パラメーター

_PTarget
このメソッドを呼び出しているターゲット ブロックへのポインター。

解説

このメソッドは、このソースからリンク解除されている ITarget オブジェクトによって呼び出されます。 ソース ブロックは、ターゲット ブロック用に予約されたすべてのリソースを解放できます。

remove_targets

このソース ブロックのすべてのターゲット リンクを削除します。 これはデストラクターから呼び出す必要があります。

void remove_targets();

予約

この source_block オブジェクトから以前に提供されたメッセージを予約します。

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

パラメーター

_MsgId
提供された message オブジェクトの runtime_object_identity

_PTarget
reserve メソッドを呼び出しているターゲット ブロックへのポインター。

戻り値

メッセージが正常に予約された場合は true、それ以外の場合は false。 予約は、さまざまな理由で失敗する可能性があります。たとえば、メッセージが別のターゲットによって既に予約されているか受け入れられている場合や、ソースが予約を拒否できる場合などです。

解説

パラメーター _PTargetNULL である場合に、メソッドは invalid_argument 例外をスローします。

reserve を呼び出し、それが成功したら、consume または release のどちらかを呼び出して、メッセージの所有権を取得または放棄する必要があります。

reserve_message

派生クラスでオーバーライドされると、この source_block オブジェクトによって以前に提供されたメッセージを予約します。

virtual bool reserve_message(runtime_object_identity _MsgId) = 0;

パラメーター

_MsgId
予約する message オブジェクトの runtime_object_identity

戻り値

メッセージが正常に予約された場合は true、それ以外の場合は false

解説

reserve が呼び出された後、true が返された場合は、consume または 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);

パラメーター

_Msg
同期して送信する message オブジェクトへのポインター。

この source_block オブジェクトからターゲット ブロックのリンクを解除します。

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

パラメーター

_PTarget
この source_block オブジェクトからリンク解除する ITarget ブロックへのポインター。

解説

パラメーター _PTargetNULL である場合に、メソッドは invalid_argument 例外をスローします。

この 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 クラス