1

キューをオーバーフローから保護するようなものを持つことは可能ですがlimiter_node<T>、キューに収まらないメッセージを破棄する代わりに、それらを他のノードに転送しますか? のようなものが欲しい

typedef std::string S;
using namespace tbb::flow;
source_node<S> input(g, Input(), false);
limiter_node<S> limiter(g, queue_len);
function_node<S, S> processor(g, threadpool_size, Processor());
function_node<S, int> output(g, serial, Output());

make_edge(input, limiter);
make_edge(limiter, processor);
make_edge(limiter.magic_forwarder_of_failed_deliveries_thank_you, output); // ???
make_edge(processor, output);
make_edge(output, limiter.decrement);

基本的に私は大量のブロッキング IO バウンド «ノード» でできるだけ多くのデータを処理し、残りを未処理の出力ノードに直接転送したいと考えています。

4

1 に答える 1

3

(開示: 私は Intel で Intel Threading Building Blocks に取り組んでいます。)

私はyohjpに同意します.multifunction_nodeでこれを行うことができます.

typedef multifunction_node< S, tuple< S, S > > mnode_t;

struct Forwarder {
// This assumes
//   port 0 is connected to the limiter
//   port 1 is the alternative path
void operator()( const S &s, mnode_t::output_ports_type &outs ) {
    if ( !get<0>(outs).try_put(s) ) {
        get<1>(outs).try_put(s);
    }
} };

エッジが次のように変更された場合:

make_edge(input, forwarder);
make_edge(output_port<0>(forwarder), limiter);
make_edge(limiter, processor);
make_edge(output_port<1>(forwarder), output);

また、プロセッサを通過したものに対してのみデクリメントが呼び出されるようにする必要があります。

于 2013-06-07T16:16:22.033 に答える