multifunction_node テンプレート・クラス

概要

receiver<InputType> のテンプレート・クラス。sender<T> の出力のタプルを含みます。このノードには、ユーザーが設定する同時実行数の制限を適用できます。同時実行数の制限が適用されると、着信メッセージのユーザー定義 body を実行します。body は 1 つ以上の出力メッセージを作成してサクセサーにブロードキャストします。

構文

template <typename Input, typename Output, 
    graph_buffer_policy = queueing, typename Allocator=cache_aligned_allocator<Input> >
    class multifunction_node;

ヘッダー

#include "tbb/flow_graph.h"

説明

1 つの入力ポートでメッセージを受け取って、サクセサーにブロードキャストする 1 つ以上のメッセージを生成するノードに使用されます。

multifunction_node は、内部定数しきい値 T と内部カウンター C を維持します。構築時に、C = 0、T はコンストラクターに渡された値に設定されます。try_put 呼び出しの動作は、次の表のように、T と C の値によって決定されます。

multifunction_node の try_put 呼び出しの動作

しきい値 T の値

カウンター C の値

bool try_put( input_type v )

T == graph::unlimited

NA

body(v) を実行するタスクがスポーンされます。true を返します。

T != flow::unlimited

C < T

C をインクリメントします。body(v) を実行して C をデクリメントするタスクがスポーンされます。true を返します。

T != flow::unlimited

C >= T

false を返します。

multifunction_node には、ユーザーが設定可能な同時実行数の制限が適用されます。flow::unlimited concurrency を指定すると、ノードの無制限のコピーを同時に実行できます。flow::serial concurrency を指定すると、ノードの 1 つのコピーのみ同時に実行できます。同時実行数を制限する size_t 型の値を 1 から unlimited の間で指定することもできます。

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

multifunction_node ボディーコンセプト

擬似署名

意味

B::B( const B& )

コピー・コンストラクター。

B::~B()

デストラクター。

void operator=( const B& )

代入。

void B::operator()(const input_type &v, output_ports_type &p)

v の操作を実行します。ゼロ以上の出力ポートで try_put を呼び出すことがあります。出力ポートで複数回 try_put を呼び出すことがあります。

注意

multifunction_node に渡されるボディー・オブジェクトはコピーされます。そのため、メンバー変数を更新してもノードの構築に使用されたオリジナルのオブジェクトには影響しません。ノードの外部からボディー・オブジェクト内に保持されている状態を確認する場合は、copy_body 関数を使用して更新されたコピーを取得します。

ボディー・オブジェクトは、そのエンクロージング・グラフをスローまたはキャンセルすることがあります。詳細は、「task_group_context」および「例外」を参照してください。

サンプル

下記のサンプルは、整数のストリームを奇数と偶数に分けて適切な出力キューに配置する multifunction_node を示しています。

Body メソッドは、入力値への読み取り専用の参照および出力ポートのタプルへの参照を引数として受け取ります。Body メソッドは 1 つ以上の出力ポートにアイテムを格納することがあります。

multifunction_node の出力ポートは、make_edge メソッドおよび register_successor を使用してほかのグラフのノードに接続できます。

#include "tbb/flow_graph.h"
using namespace tbb::flow;
typedef multifunction_node<int, tbb::flow::tuple<int,int> > multi_node;

struct MultiBody {

  void operator()(const int &i, multi_node::output_ports_type &op) {
    if(i % 2) 
      std::get<1>(op).try_put(i); // 奇数キューに入れる
    else 
      std::get<0>(op).try_put(i); // 偶数キューに入れる
  }
};

int main() {
  graph g;

  queue_node<int> even_queue(g);
  queue_node<int> odd_queue(g);

  multi_node node1(g,unlimited,MultiBody());

  output_port<0>(node1).register_successor(even_queue);
  make_edge(output_port<1>(node1), odd_queue);

  for(int i = 0; i < 1000; ++i) {
    node1.try_put(i);
  }
  g.wait_for_all();
}

メンバー

namespace tbb {
  template <typename Input, typename Output, 
    graph_buffer_policy = queueing, typename Allocator=cache_aligned_allocator<Input> >
    class multifunction_node : public graph_node, public receiver<Input>
  {
  public:

    template < typename Body >
    multifunction_node( graph &g, size_t concurrency, Body body );
    multifunction_node( const multifunction_node &other);
    ~multifunction_node();

    // 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 );

    typedef implementation-dependent output_ports_type;
    output_ports_type& output_ports();
  };
}
次の表は、このテンプレート・クラスのメンバーの詳細な情報を提供します。
メンバー 説明
template < typename Body > multifunction_node( graph &g, size_t concurrency, Body body )

ボディーに body を使用して multifunction_node を構築します。ほとんどの場合、body に対する concurrency の呼び出しは同時に行われます。

multifunction_node( const multifunction_node &other)

other の構築時の状態と同じ初期状態で multifunction_node を構築します。構築される multifunction_node には、other と同じ graph オブジェクトへの参照、other で使用される初期 body のコピー、other と同じ同時実行数しきい値が含まれます。other のプレデセッサーおよびサクセサーはコピーされません。

注意

新しいボディー・オブジェクトは、other の構築時に提供されたオリジナルのボディーのコピーからコピー構築されます。このため、other の構築後に other のボディーのメンバー変数に対して行われた変更は、新しい multifunction_node のボディーに影響しません。

~multifunction_node()

デストラクター。

bool try_put( const input_type &v )

詳細は、上記の表「multifunction_node の try_put 呼び出しの動作」を参照してください。

戻り値: true

bool register_predecessor( predecessor_type &p )

プレデセッサーのセットに p を追加します。

戻り値: true

bool remove_predecessor( predecessor_type &p )

プレデセッサーのセットから p を削除します。

戻り値: true

output_ports_type& output_ports();

戻り値: 出力ポートのタプル。

関連情報