continue_node テンプレート・クラス

概要

graph_nodecontinue_receiversender<T> のテンプレート・クラス。トリガーされると指定されたボディー・オブジェクトを実行し、生成された値をすべてのサクセサーにブロードキャストします。

構文

template< typename Output > class continue_node;

ヘッダー

#include "tbb/flow_graph.h"

説明

実行する前にプレデセッサーの完了を待機するが、入力エッジ間で明示的なデータが渡されないノードに使用されます。ノードの出力は 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_predecessorremove_predecessor を適切に呼び出します。

try_put メソッドを呼び出すと、C がインクリメントされます。インクリメント後に C>=T の場合、C は 0 にリセットされ、タスクは body() の結果をすべてのサクセサーにブロードキャストするためスポーンされます。C のインクリメント、タスクをスポーンする処理、C のリセットはすべて、ノードに関してアトミックに行われます。インクリメントの後に C<T になった場合、追加のアクションは行われません。

ボディー・オブジェクトの実行により生成された値は、すべてのサクセサーにブロードキャストされます。サクセサーがメッセージを拒否した場合、「メッセージ・パッシング・プロトコル」で説明されているプロトコルを使用して処理されます。

continue_node は、グラフのターミナルノードとして動作できます。continue_msgOutput が使用され、サクセサーは接続されません。

Output は、コピー構築可能および代入可能でなければなりません。

continue_node のボディーコンセプトを次に示します。

continue_node<Output> ボディーコンセプト

擬似署名

意味

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」および「例外」を参照してください。

メンバー

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

関連情報