graph_node、receiver<Input>、sender<Output> のテンプレート・クラス。このノードには、ユーザーが設定する同時実行数の制限を適用できます。デフォルトで、function_node には入力に内部 FIFO バッファーがあります。同時実行数の制限により直ちに処理できないメッセージは、この FIFO バッファーに一時的に格納されます。テンプレートの引数で、この内部バッファーを無効にするように指定できます。FIFO バッファーが無効のときに、ノードの同時実行数の制限によりメッセージを直ちに処理できない場合、着信メッセージは拒否されます。
template < typename Input, typename Output = continue_msg, graph_buffer_policy = queueing, typename A = cache_aligned_allocator<Input> > class function_node;
#include "tbb/flow_graph.h"
function_node は、1 つの入力ポートで Input 型のメッセージを受け取り、すべてのサクセサーにブロードキャストされる Output 型の 1 つの出力メッセージを生成します。サクセサーがメッセージを拒否した場合、「メッセージ・パッシング・プロトコル」で説明されているプロトコルを使用して処理されます。
graph_buffer_policy == queueing の場合、内部の無制限入力バッファーが A 型のアロケーターから取得したメモリーを使用して維持されます。
function_node は、内部定数しきい値 T と内部カウンター C を維持します。構築時に、C = 0、T はコンストラクターに渡された値に設定されます。try_put 呼び出しの動作は、次の表のように、T と C の値によって決定されます。
しきい値 T の値 |
カウンター C の値 |
bool try_put( const input_type &v ) |
---|---|---|
T == flow::unlimited |
NA |
body(v) の結果をすべてのサクセサーにブロードキャストするタスクがスポーンされます。true を返します。 |
T != flow::unlimited |
C < T |
C をインクリメントします。body(v) の結果をすべてのサクセサーにブロードキャストして C をデクリメントするタスクがスポーンされます。true を返します。 |
T != flow::unlimited |
C >= T |
テンプレート引数が graph_buffer_policy==queueing の場合、v は C < T になるまで内部 FIFO バッファーに格納されます。T が C 未満になると、C がインクリメントされ、body(v) の結果をすべてのサクセサーにブロードキャストして C をデクリメントするタスクがスポーンされます。true を返します。 テンプレート引数が graph_buffer_policy==rejecting で C >= T の場合、false を返します。 |
function_node には、ユーザーが設定可能な同時実行数の制限が適用されます。flow::unlimited を指定すると、ボディーの無制限の呼び出しを同時に実行できます。flow::serial を指定すると、ボディーの 1 つの呼び出しのみ同時に実行できます。同時実行数を制限する size_t 型の値を 1 から unlimited の間で指定することもできます。
引数で graph_buffer_policy==rejecting を指定すると、function_node は、「メッセージ・パッシング・プロトコル」で説明されているようにプレデセッサー・セットを維持します。function_node の状態が C >= T から C < T に遷移すると、C >= T になるまで、またはセットに有効なプレデセッサーがなくなるまで、プレデセッサーのセットから新しいメッセージを取得しようとします。
function_node は、グラフのターミナルノードとして動作できます。continue_msg の Output が使用され、サクセサーは接続されません。
Input と Output は、コピー構築可能および代入可能でなければなりません。
function_node のボディーコンセプトを次に示します。
擬似署名 |
意味 |
---|---|
B::B( const B& ) |
コピー・コンストラクター。 |
B::~B() |
デストラクター。 |
void operator=( const B& ) |
代入。擬似署名の戻り型 void は、operator= は値を返す必要がないことを示します。operator= は値を返すことができますが無視されます。 |
Output B::operator() (const Input &v) const |
v で操作を実行して Output 型の値を返します。 |
function_node に渡されるボディー・オブジェクトはコピーされます。そのため、メンバー変数を更新してもノードの構築に使用されたオリジナルのオブジェクトには影響しません。ノードの外部からボディー・オブジェクト内に保持されている状態を確認する場合は、copy_body 関数を使用して更新されたコピーを取得します。
ボディー・オブジェクトは、そのエンクロージング・グラフをスローまたはキャンセルすることがあります。詳細は、「task_group_context」および「例外」を参照してください。
namespace tbb { namespace flow { enum graph_buffer_policy { rejecting, reserving, queueing, tag_matching }; template < typename Input, typename Output = continue_msg, graph_buffer_policy = queueing, typename A = cache_aligned_allocator<Input> > class function_node : public graph_node, public receiver<Input>, public sender<Output> { public: template<typename Body> function_node( graph &g, size_t concurrency, Body body ); function_node( const function_node &src ); // receiver<Input> typedef Input 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> function_node(graph &g, size_t concurrency, Body body) |
body のコピーを呼び出す function_node を構築します。ほとんどの場合、body に対する concurrency の呼び出しは同時に行われます。 |
function_node( const function_node &src ) |
src の構築時の状態と同じ初期状態で function_node を構築します。構築される function_node には、src と同じ graph オブジェクトへの参照、src で使用される初期 body のコピー、src と同じ同時実行数しきい値が含まれます。src のプレデセッサーおよびサクセサーはコピーされません。 注意新しいボディー・オブジェクトは、src の構築時に提供されたオリジナルのボディーのコピーからコピー構築されます。このため、src の構築後に src のボディーのメンバー変数に対して行われた変更は、新しい function_node のボディーに影響しません。 |
bool try_put( const input_type &v ) |
詳細は、上記の表「function_node の try_put 呼び出しの動作」を参照してください。 戻り値: 入力が受け付けられた場合は true。その他の場合は false。 |
bool register_predecessor( predecessor_type &p ) |
プレデセッサーのセットに p を追加します。 戻り値: true。 |
bool remove_predecessor( predecessor_type &p ) |
プレデセッサーのセットから p を削除します。 戻り値: true。 |
bool register_successor( successor_type &r ) |
サクセサーのセットに r を追加します。 戻り値: true。 |
bool remove_successor( successor_type &r ) |
サクセサーのセットから r を削除します。 戻り値: true。 |
bool try_get( output_type &v ) |
function_node に出力のバッファーは含まれていないため、try_get 呼び出しは常に拒否されます。 戻り値: false。 |
bool try_reserve( output_type &v ) |
function_node に出力のバッファーは含まれていないため、予約することはできません。 戻り値: false。 |
bool try_release( ) |
function_node に出力のバッファーは含まれていないため、予約することはできません。 戻り値: false。 |
bool try_consume( ) |
function_node に出力のバッファーは含まれていないため、予約することはできません。 戻り値: false。 |