or_node の現在の実装で、やりたいことができるはずです。(or_node の出力をより使いやすくするために再設計していますが、or_node コミュニティ プレビュー機能の問題については、あなたのようなユーザーからの入力が必要です。)
覚えておくべきことの 1 つは、or_node を使用してコードをコンパイルするときに CPF をオンにすることです。スイッチは -DTBB_PREVIEW_GRAPH_NODES=1 です。
# define TBB_PREVIEW_GRAPH_NODES 1 // necessary to turn on the or_node community Preview Feature.
#include "tbb/flow_graph.h"
#include <vector>
using namespace tbb::flow;
// The output format of the or_node is a struct that contains
// 1. the index of the input that the message appeared on, and
// 2. a tuple, the (i-1)th element of which is the message received
typedef or_node<tuple<std::vector<double>, bool> > my_or_node_type;
// it wasn't clear from the description if you wanted to differentiate between the vectors output with
// an input of type 1. or type 2. If you need to do that you can add an extra output port to the multifunction_node.
typedef multifunction_node<my_or_node_type::output_type, tuple<std::vector<double>, int> > my_mf_node_type;
struct mf_node_body {
void operator()(const my_or_node_type::output_type &in, my_mf_node_type::output_ports_type &op) {
switch(in.indx) {
case 0: {
// do the operation for the first input (the std::vector) The vector will be in
// get<0>(in.result). Remember you are copying vectors here, so if you have big
// vectors you will probably want to do some buffer management on your own and
// pass refs to the vector instead.
}
break;
case 1: {
// do the operation signaled by the second input (the bool.) The value of the
// input is in get<1>(in.result).
}
break;
}
}
};
main() {
graph g;
my_or_node_type multi_in(g);
my_mf_node_type multi_out(g, unlimited, mf_node_body());
// if the vector-producing node is called vpn, you attach it to the 0-th input of the or_node with
// make_edge(vpn, input_port<0>(multi_in));
//
// the bool-producing node bn can be attached similarly:
// make_edge(bn, input_port<1>(multi_in);
//
// attach the multi-in to the multi-out:
// make_edge(multi_in, multi_out);
//
// attach the vector consumer node vcn
// make_edge(output_port<0>(multi_out), vcn);
//
// attach the integer output to the int consuming node icn
// make_edge(output_port<1>(multi_out), icn);
//
// start up the graph and make sure to do a wait_for_all() at the end.
}
multifunction_node 本体は並行して呼び出されるため、実行する作業に競合状態があってはならないことに注意してください (何らかの理由で競合状態が必要serial
な場合を除きます) unlimited
。グラフを安全に破棄できるようにする唯一の方法は、ノードを実行しているタスクがないことを確認することです。これを行う最善の方法は、g.wait_for_all()
.
よろしく、クリス
PS - 1 つの補遺。multifunction_node が定義されserial
ている場合、明示的に除外しない限り、入力バッファーがあります。バッファが存在することを期待していない場合、これによりグラフの動作が変わる可能性があります。