0

1 つのメッセージを渡す前に、2 つの着信メッセージを蓄積する必要があります。continue_nodeのドキュメントには、しきい値パラメーター T が記載されていますが、それが接続された先行ノードの数と常に等しいかどうかは明確ではありません。私の場合、前任者は 1 つしかありませんが、T = 2 が必要です。これは可能ですか?

continue_node<continue_msg> count2(g, 1, MessageForwarder());
make_edge(some_message_generator, count2);
T==2; // hopefully true?

MessageForwarder が単純なメッセージ フォワーダー本体である場合 (定義済みのものがない場合は?)、

class MessageForwarder {
    continue_msg operator()(continue_msg /*m*/) {
        return continue_msg();
    }
};

これについて、または単純な「カウントノード」を作成する別の方法についてアドバイスをいただければ幸いです。

4

1 に答える 1

1

ご想像のとおり、continue_node は、先行ノードの数に相当する数の continue_msgs を受信するまで、本体を起動しません。コンストラクターで先行カウントを指定すると、カウントはその数に初期化され、ノードにエッジを追加するとそのカウントがインクリメントされます。

これを示す小さなプログラムを含めています。

#include "tbb/flow_graph.h"
#include <iostream>

using namespace tbb::flow;

struct continue_body {
    continue_msg operator()(const continue_msg& /*c*/) {
        return continue_msg();
    }
};

struct output_body {
    int my_count;
    output_body() { my_count = 0; }
    continue_msg operator()(const continue_msg&) {
        std::cout << "Received continue_msg " << ++my_count << "\n";
    }
};

int
main() {
    graph g;
    continue_node<continue_msg> counting_node(g, continue_body());
    continue_node<continue_msg> counting_node2(g, 1, continue_body());
    function_node<continue_msg> output_node(g, serial, output_body());

    make_edge(counting_node, counting_node2);
    make_edge(counting_node2, output_node);
    for(int i = 0; i < 10; ++i) {
        counting_node.try_put(continue_msg());
    }
    g.wait_for_all();
}

continue_node count_node2 を 1 に初期化し、それにエッジを追加しました。出力は

Received continue_msg 1
Received continue_msg 2
Received continue_msg 3
Received continue_msg 4
Received continue_msg 5

mutlifunction_nodes でこれを行う別の方法については、TBB フォーラム サイトの回答を参照してください。

于 2013-07-23T16:07:30.227 に答える