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 メッセージング ブロックが特定の値で初期化されているかどうかを確認します。 |
インデックス | choice メッセージング ブロックによって選択された要素を表す tuple へのインデックスを返します。 |
link_target | この choice メッセージング ブロックにターゲット ブロックをリンクします。 |
release | 以前に成功したメッセージの予約を解除します。 |
release_ref | この choice メッセージング ブロックの参照カウントを解除します。 |
reserve | この choice メッセージング ブロックから以前に提供されたメッセージを予約します。 |
unlink_target | この choice メッセージング ブロックからターゲット ブロックをリンク解除します。 |
unlink_targets | この choice メッセージング ブロックからすべてのターゲットをリンク解除します (ISource::unlink_targets をオーバーライドします) |
value | choice メッセージング ブロックによってインデックスが選択されたメッセージを取得します。 |
解説
choice ブロックは、受信メッセージが 1 つしか使用されないことを保証します。
詳細については、「非同期メッセージ ブロック」を参照してください。
継承階層
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
メッセージング ブロックを構築します。
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
メソッドを使用して抽出できます。
link_target
この 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
のどちらかを呼び出して、メッセージの所有権を取得または放棄する必要があります。
unlink_target
この choice
メッセージング ブロックからターゲット ブロックをリンク解除します。
virtual void unlink_target(_Inout_ ITarget<size_t>* _PTarget);
パラメーター
_PTarget
この choice
メッセージング ブロックからリンク解除する ITarget
ブロックへのポインター。
unlink_targets
この choice
メッセージング ブロックからすべてのターゲットをリンク解除します
virtual void unlink_targets();
解説
このメソッドをデストラクターから呼び出す必要はありません。これは、内部の single_assignment
ブロックのデストラクターが適切にリンク解除するためです。
値
choice
メッセージング ブロックによってインデックスが選択されたメッセージを取得します。
template <
typename _Payload_type
>
_Payload_type const& value();
パラメーター
_Payload_type
メッセージ ペイロードの種類。
戻り値
メッセージのペイロード。
解説
choice
メッセージング ブロックはさまざまなペイロードの種類を伴う入力を受け取る可能性があるため、取得の時点でペイロードの種類を指定する必要があります。 index
メソッドの結果に基づいて種類を特定できます。