2013-07-22 73 views
0

我需要在傳遞單個消息之前累積2個傳入消息。 continue_node的文檔提到了閾值參數T,但不清楚它是否總是等於連接的前驅器的數量。在我的情況下,只有一個前任,但我想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(); 
    } 
}; 

我很高興聽到這個任何意見或作出的可能是另一種方式一個簡單的「計數節點」。

回答

1

正如你猜測的那樣,continue_node不會觸發body,直到它接收到一些與前輩數量相等的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 counting_node2爲1,並增加了一個邊緣到它。輸出應該是

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

你可以看看an answer on the TBB forum site另一種方法來做到這一點與mutlifunction_nodes。