次の方法で共有


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

パブリック メソッド

名前 説明
accept この source_block オブジェクトから提供されたメッセージを受け入れ、所有権を呼び出し元に譲渡します。
acquire_ref(参照の取得) 削除を防ぐために、この 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 オブジェクトに新しいターゲットがリンクされたことを通知するコールバック。
入力メッセージを処理する 入力メッセージを処理します。 これは、source_block から派生した伝達子ブロックにのみ有効です
出力メッセージを伝播する メッセージをターゲットに伝達します。
すべてのターゲットに伝播 派生クラスでオーバーライドされると、指定されたメッセージをリンク先の一部またはすべてのターゲットに伝達します。 これは、メッセージ ブロックの主要な伝達ルーチンです。
release_message 派生クラスでオーバーライドされると、以前のメッセージ予約を解放します。
remove_targets このソース ブロックのすべてのターゲット リンクを削除します。 これはデストラクターから呼び出す必要があります。
reserve_message 派生クラスでオーバーライドされると、この source_block オブジェクトによって以前に提供されたメッセージを予約します。
resume_propagation 派生クラスで上書きされると、リソース予約の解除後にプロパゲーションを再開します。
sync_send メッセージを非同期的にキューに入れ、伝達タスクを開始します。 (まだ実行されていない場合)
リンク解除対象通知 この source_block オブジェクトからターゲットのリンクが解除されたことを通知するコールバック。
wait_for_outstanding_async_sends すべての非同期伝達が完了するまで待機します。 この伝達子固有のスピン待機は、メッセージ ブロックのデストラクターで使用され、すべての非同期伝達がブロックを破棄する前に完了する時間を持てるようにします。

解説

このクラスによって提供されるリンク管理と同期を利用するには、メッセージ ブロックをこのブロックから派生させる必要があります。

継承階層

ISource

source_block

要件

ヘッダー: agents.h

名前空間: concurrency

承認する

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

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

パラメーター

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

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

戻り値

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

解説

メソッドは、引数 の場合、 適切ではない引数の例外 をスローします。

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

メッセージ受信

派生クラスでオーバーライドされる際、ソースによって提供されるメッセージを受け入れます。 メッセージ ブロックは、このメソッドをオーバーライドして _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> *);

解説

このメソッドは、ITarget メソッドの実行中にこのソースにリンクされる link_target オブジェクトによって呼び出されます。

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
予約された runtime_object_identity オブジェクトの message

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

戻り値

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

解説

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

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

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

メッセージを処理する

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

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

パラメーター

_MsgId
消費される runtime_object_identity オブジェクトの message

戻り値

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

解説

accept に似ていますが、常に reserve の呼び出しが先に行われます。

バッチ処理を有効にする

このブロックのバッチ処理を有効にします。

void enable_batched_processing();

イニシャライズソース

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

解説

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

この 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();

すべてのターゲットに伝播する

派生クラスでオーバーライドされると、指定されたメッセージをリンク先の一部またはすべてのターゲットに伝達します。 これは、メッセージ ブロックの主要な伝達ルーチンです。

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 メソッドを呼び出しているターゲット ブロックへのポインター。

解説

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

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

リリースメッセージ

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

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

予約

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

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

パラメーター

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

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

戻り値

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

解説

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

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 を呼び出して、メッセージの所有権を取得または解放する必要があります。

プロパゲーション再開 (resume_propagation)

派生クラスで上書きされると、リソース予約の解除後にプロパゲーションを再開します。

virtual void resume_propagation() = 0;

source_block

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

解説

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

この source_block オブジェクトからターゲットのリンクが解除されたことを通知するコールバック。

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

パラメーター

_PTarget
リンク解除された ITarget ブロック。

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

virtual void unlink_targets();

待機未処理非同期送信

すべての非同期伝達が完了するまで待機します。 この伝達子固有のスピン待機は、メッセージ ブロックのデストラクターで使用され、すべての非同期伝達がブロックを破棄する前に完了する時間を持てるようにします。

void wait_for_outstanding_async_sends();

関連項目

コンカレンシー名前空間
ISource クラス