graph_node、continue_receiver、sender<T> のテンプレート・クラス。 トリガーされると指定されたボディー・オブジェクトを実行し、生成された値をすべての後続 (successor) にブロードキャストします。
template< typename Output > class continue_node;
#include "tbb/flow_graph.h"
実行する前に先行 (predecessor) の完了を待機するが、入力エッジ間で明示的なデータが渡されないノードに使用されます。 ノードの出力は continue_msg または値です。
continue_node は、内部しきい値 T と内部カウンター C を維持します。 構築時に先行数の値が指定された場合は、T がその値に、C=0 に設定されます。 その他の場合は、C=T=0 に設定されます。
register_predecessor メソッドを呼び出すと、しきい値 T がインクリメントされます。 remove_predecessor メソッドを呼び出すと、しきい値 T がデクリメントされます。 make_edge および remove_edge 関数は、エッジが continue_node に追加または削除されると、register_predecessor と remove_predecessor を適切に呼び出します。
try_put メソッドを呼び出すと、C がインクリメントされます。 インクリメント後に C>=T の場合、C は 0 にリセットされ、タスクは body() の結果をすべての後続にブロードキャストするためキューに入れられます。 C のインクリメント、タスクをキューに入れる処理、C のリセットはすべて、ノードに関してアトミックに行われます。 インクリメントの後に C<T になった場合、追加のアクションは行われません。
ボディー・オブジェクトの実行により生成された値は、すべての後続にブロードキャストされます。 後続がメッセージを拒否した場合、メッセージ・パッシング・プロトコルを使用して処理されます (詳細は、以下のリンクを参照)。
continue_node は、グラフのターミナルノードとして動作できます。 continue_msg の Output が使用され、後続は接続されません。
continue_node のボディーコンセプトを次に示します。
|
擬似署名 |
意味 |
|---|---|
|
B::B( const B& ) |
コピー・コンストラクター。 |
|
B::~B() |
デストラクター。 |
|
void operator=( const B& ) |
代入。擬似署名の戻り型 void は、operator= は値を返す必要がないことを示します。 operator= は値を返すことができますが無視されます。 |
|
Output B::operator()(const continue_msg &v) const |
操作を実行して Output 型の値を返します。 |
continue_node に渡されたボディー・オブジェクトがコピーされます。 そのため、メンバー変数を更新してもノードを構築するために使用されたオリジナルのオブジェクトには影響しません。 ノードの外部からボディー・オブジェクト内に保持されている状態を調査しなければならない場合は、copy_body 関数を使用して更新されたコピーを取得します。
ボディー・オブジェクトは、そのエンクロージング・グラフをスローまたはキャンセルすることがあります。詳細は、「task_group_context」および「例外」を参照してください。
Output は、コピー構築可能および代入可能でなければなりません。
namespace tbb {
namespace flow {
template< typename Output >
class continue_node :
public graph_node, public continue_receiver,
public sender<Output> {
public:
template<typename Body>
continue_node( graph &g, Body body );
template<typename Body>
continue_node( graph &g, int number_of_predecessors,
Body body );
continue_node( const continue_node &src );
// continue_receiver
typedef continue_msg input_type;
typedef sender<input_type> predecessor_type;
bool try_put( const input_type &v );
bool register_predecessor( predecessor_type &p );
bool remove_predecessor( predecessor_type &p );
// sender<Output>
typedef Output output_type;
typedef receiver<output_type> successor_type;
bool register_successor( successor_type &r );
bool remove_successor( successor_type &r );
bool try_get( output_type &v );
bool try_reserve( output_type &v );
bool try_release( );
bool try_consume( );
};
}
}
| メンバー | 説明 |
|---|---|
| template< typename Body> continue_node( graph &g, Body body ) |
body を呼び出す continue_node を構築します。 |
| template< typename Body> continue_node( graph &g, int number_of_predecessors, Body body ) |
body を呼び出す continue_node を構築します。 しきい値 T は number_of_predecessors に初期化されます。 |
| continue_node( const continue_node &src ) |
src の構築後の状態と同じ初期状態で continue_node を構築します。 現在の try_puts 呼び出しを受け取った回数、または現在の既知の先行数はコピーしません。 構築される continue_node には、src と同じ graph オブジェクトへの参照、src で使用される初期 body のコピーが含まれます。また、src がゼロ以外のしきい値で構築されている場合のみゼロ以外のしきい値が含まれます。 警告新しいボディー・オブジェクトは、src の構築時に提供されたオリジナルのボディーのコピーからコピー構築されます。 このため、src の構築後に src のボディーのメンバー変数に対して行われた変更は、新しい continue_node のボディーに影響しません。 |
| bool try_put( const input_type &v ) |
try_put 呼び出しを受け取った回数をインクリメントします。 インクリメント後の回数が既知の先行数と等しい場合、タスクは body を実行するようにキューに入れられ、try_put 呼び出しの内部カウントはゼロにリセットされます。 このメソッドは、ボディータスクをキューに入れる処理と内部カウントの更新があたかもアトミックに行われたように実行されます。 ボディーの実行が完了するのを待ちません。 戻り値: true。 |
| bool register_predecessor( predecessor_type &p ) |
既知の先行数をインクリメントします。 戻り値: true。 |
| bool remove_predecessor( predecessor_type &p |
既知の先行数をデクリメントします。 警告この呼び出しにより受け取った try_put 呼び出しの回数が既知の先行数と等しくなる場合、ボディーは呼び出されません。 つまり、remove_predecessor の呼び出しはボディーを呼び出しません。 |
| bool register_successor( successor_type &r ) |
後続のセットに r を追加します。 戻り値: true。 |
| bool remove_successor( successor_type &r ) |
後続のセットから r を削除します。 戻り値: true。 |
| bool try_get( output_type &v ) |
continue_node にバッファーは含まれていないため、 try_get 呼び出しは常に拒否されます。 戻り値: false。 |
| bool try_reserve( output_type &v ) |
continue_node にバッファーは含まれていないため、 予約することはできません。 戻り値: false。 |
| bool try_release( ) |
continue_node にバッファーは含まれていないため、 予約することはできません。 戻り値: false。 |
| bool try_consume( ) |
continue_node にバッファーは含まれていないため、 予約することはできません。 戻り値: false。 |