0

パイプラインのような同期関数呼び出しを模倣するフロー グラフへのアダプターを作成しようとしています。しかし、ブロックして特定のトークンの出力を待つ方法がわかりません。wait_for_allすべての値を待つ必要がないため、グラフを呼び出しても役に立ちません。誰でも解決策を提案できますか?

template <typename TOutput, typename TInput>
class FlowPathAdapter {
public:
    TOutput operator()(const TInput& val) {
        m_input->try_put(val);
        TOutput result;
        // What should be done here to ensure that
        // m_output returns the result corresponding to this specific token?
        m_output->try_get(result);
        return result;
    }

private:
    // input and output are connected in some graph constructed outside the adapter
    std::shared_ptr<tbb::flow::receiver<TInput>> m_input;
    std::shared_ptr<tbb::flow::sender<TOutput>> m_output;
};
4

2 に答える 2

0

受信者クラスと送信者クラスは「純粋な仮想」クラスです (ノードの定義を簡素化するために、try_* メソッドにはデフォルトの動作があります)。flow::graph ノードごとに、そのクラスに固有の動作でオーバーライドされます。

特定の種類のノード (またはアダプター) を作成する場合は、仮想メソッドをオーバーライドする必要があります。ただし、function_node を使用して、このアダプターでやろうとしていることを行うことができます。try_get および try_put 呼び出し (function_node の動作の一部です) を削除できます。

// notice TInput and TOutput are exchanged
template < typename TInput, typename TOutput >
class FlowPathAdapterBody {
public:
    TOutput operator()(const TInput& val) {
        // val has the value passed to us
        TOutput result;
        // computation turning val into result
        return result;
    }
};

tbb::flow::graph g;
// node is fully-parallel in this case
tbb::flow::function_node<int, int> fnode(g, tbb::flow::unlimited, FlowPathAdapterBody<int,int>());

// ...

複数の先行ノードを function_node の入力にアタッチし、複数の後続ノードをその出力にアタッチできます。

デフォルトでは、function_node の入力にはバッファがあるため、ノードがシリアルであっても、常に入力を受け入れます。入力をバッファするのではなく拒否したい場合は、ノードをfunction_node<T,U,tbb::flow::rejecting>.

より高度な動作 (入力ごとに複数のメッセージを発行する機能、オプションで特定の入力に対してメッセージを発行しない機能、または特別な条件を通知する機能など) が必要な場合は、multifunction_node を確認してください。 .)

よろしく、クリス

于 2013-07-29T15:27:21.823 に答える