同時実行を制限#
単一ノードのインスタンスの数を制御するには、ノードの同時実行制限を使用できます。同時実行制限に達した後にメッセージを拒否するには、「拒否」ノードとして構築します。
関数ノードは、1 つ以上のテンプレート引数を使用して構築されます。3 番目の引数は、ノードが使用するバッファーポリシーを制御しますが、デフォルトではキューイングになります。キューイング・ポリシーでは、同時実行制限に達した function_node は引き続き受信メッセージを受け入れて、それらを内部的にバッファリングします。ポリシーが拒否に設定されている場合、ノードは受信メッセージを拒否します。
template < typename Input,
typename Output = continue_msg,
graph_buffer_policy = queueing >
class function_node;例えば、グラフ内で処理中の大きなオブジェクトの数を制御するには、input_node の下流に拒否する function_node を以下のように配置します。
graph g;
int src_count = 0;
int number_of_objects = 0;
int max_objects = 3;
input_node< big_object * > s( g, [&]( oneapi::tbb::flow_control& fc ) -> big_object* {
if ( src_count < M ) {
big_object* v = new big_object();
++src_count;
return v;
} else {
fc.stop();
return nullptr;
}
} );
s.activate();
function_node< big_object *, continue_msg, rejecting > f( g, 3,
[]( big_object *v ) -> continue_msg {
spin_for(1);
delete v;
return continue_msg();
} );
make_edge( s, f );
g.wait_for_all();function_node は、最大 3 つの大きなオブジェクトを同時に操作します。ノードの並列実行しきい値は、ノードが同時に実行できる呼び出しを 3 つに制限します。function_node が 3 つのインスタンスを同時に実行している場合、input_node からの受信メッセージを拒否し、input_node は最後に作成されたオブジェクトをバッファリングし、そのボディー・オブジェクトの呼び出しを一時的に停止します。function_node が同時実行制限を下回ると、input_node から新しいメッセージが取得されます。最大 4 つの大きなオブジェクトが同時に存在し、function_node に 3 つ、input_node にバッファリングされた 1 つになります。