choice クラス

choice メッセージング ブロックは、複数のソースと単一のターゲットを持つブロックであり、一連のソースとの制御フローの相互作用を表します。 choice ブロックは、複数のソースのいずれかがメッセージを生成するのを待ち、そのメッセージを生成したソースのインデックスを伝達します。

構文

template<
    class T
>
class choice: public ISource<size_t>;

パラメーター

T
入力ソースのペイロードを表す、tuple ベースの型。

メンバー

パブリック typedef

名前 説明
type T の型エイリアス。

パブリック コンストラクター

名前 説明
choice 過負荷です。 choice メッセージング ブロックを構築します。
~choice デストラクター choice メッセージング ブロックを破棄します。

パブリック メソッド

名前 説明
accept この choice ブロックから提供されたメッセージを受け入れ、所有権を呼び出し元に譲渡します。
acquire_ref この choice メッセージング ブロックの参照カウントを取得して、削除を防ぎます。
使用 この choice メッセージング ブロックから過去に提供され、ターゲットによって正常に予約されているメッセージを使用して、所有権を呼び出し元に譲渡します。
has_value この choice メッセージング ブロックが特定の値で初期化されているかどうかを確認します。
index choice メッセージング ブロックによって選択された要素を表す tuple へのインデックスを返します。
link_target この choice メッセージング ブロックにターゲット ブロックをリンクします。
release 以前に成功したメッセージの予約を解除します。
release_ref この choice メッセージング ブロックの参照カウントを解除します。
reserve この choice メッセージング ブロックから以前に提供されたメッセージを予約します。
unlink_target この choice メッセージング ブロックからターゲット ブロックをリンク解除します。
unlink_targets この choice メッセージング ブロックからすべてのターゲットをリンク解除します (ISource::unlink_targets をオーバーライドします)
value choice メッセージング ブロックによってインデックスが選択されたメッセージを取得します。

解説

choice ブロックは、受信メッセージが 1 つしか使用されないことを保証します。

詳細については、「非同期メッセージ ブロック」を参照してください。

継承階層

ISource

choice

必要条件

ヘッダー: agents.h

名前空間: concurrency

accept

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

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

パラメーター

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

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

戻り値

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

acquire_ref

この choice メッセージング ブロックの参照カウントを取得して、削除を防ぎます。

virtual void acquire_ref(_Inout_ ITarget<size_t>* _PTarget);

パラメーター

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

解説

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

choice

choice メッセージング ブロックを構築します。

explicit choice(
    T _Tuple);

choice(
    Scheduler& _PScheduler,
    T _Tuple);

choice(
    ScheduleGroup& _PScheduleGroup,
    T _Tuple);

choice(
    choice&& _Choice);

パラメーター

_Tuple
選択肢のソースの tuple です。

_PScheduler
その内部で Scheduler メッセージング ブロックの反映タスクがスケジュールされる choice オブジェクト。

_PScheduleGroup
その内部で ScheduleGroup メッセージング ブロックの反映タスクがスケジュールされる choice オブジェクト。 使用される Scheduler オブジェクトは、スケジュール グループによって暗黙的に指定されます。

_Choice
コピー元の choice メッセージング ブロックです。 元のオブジェクトが孤立しており、これが移動コンストラクターになることに注意してください。

解説

_PScheduler または _PScheduleGroup パラメーターを指定しない場合、ランタイムは既定のスケジューラを使用しています。

移動の構築はロックの状況では行われません。ということは、移動時に処理中の軽量タスクがないことを確認するのはユーザーの責任です。 そうしないと、例外または不整合な状態で、多数の競合が発生します。

~選択

choice メッセージング ブロックを破棄します。

~choice();

消費

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

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

パラメーター

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

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

戻り値

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

解説

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

has_value

この choice メッセージング ブロックが特定の値で初期化されているかどうかを確認します。

bool has_value() const;

戻り値

ブロックが値を受け取った場合は true。それ以外の場合は false

インデックス

choice メッセージング ブロックによって選択された要素を表す tuple へのインデックスを返します。

size_t index();

戻り値

メッセージ インデックス。

解説

メッセージ ペイロードは、get メソッドを使用して抽出できます。

この choice メッセージング ブロックにターゲット ブロックをリンクします。

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

パラメーター

_PTarget
この choice メッセージング ブロックにリンクする ITarget ブロックへのポインター。

release

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

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

パラメーター

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

_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
予約する message オブジェクトの runtime_object_identity

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

戻り値

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

解説

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

この choice メッセージング ブロックからターゲット ブロックをリンク解除します。

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

パラメーター

_PTarget
この choice メッセージング ブロックからリンク解除する ITarget ブロックへのポインター。

この choice メッセージング ブロックからすべてのターゲットをリンク解除します

virtual void unlink_targets();

解説

このメソッドをデストラクターから呼び出す必要はありません。これは、内部の single_assignment ブロックのデストラクターが適切にリンク解除するためです。

value

choice メッセージング ブロックによってインデックスが選択されたメッセージを取得します。

template <
    typename _Payload_type
>
_Payload_type const& value();

パラメーター

_Payload_type
メッセージ ペイロードの種類。

戻り値

メッセージのペイロード。

解説

choice メッセージング ブロックはさまざまなペイロードの種類を伴う入力を受け取る可能性があるため、取得の時点でペイロードの種類を指定する必要があります。 index メソッドの結果に基づいて種類を特定できます。

関連項目

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