sequencer_node

[flow_graph.sequencer_node]

ノードはメッセージをシーケンス順に転送します。


// <oneapi/tbb/flow_graph.h> ヘッダーで定義 

namespace oneapi { 
namespace tbb { 
namespace flow { 

    template< typename T > 
    class sequencer_node : public graph_node, public receiver<T>, public sender<T> { 
    public: 
        template< typename Sequencer > 
        sequencer_node( graph &g, const Sequencer &s ); 
        sequencer_node( const sequencer_node &src ); 

        bool try_put( const T &v ); 
        bool try_get( output_type &v ); 
    }; 

} // namespace flow 
} // namespace tbb 
} // namespace oneapi

要件:

  • T タイプは、[copyconstructible] の CopyConstructible の要件と、[copyassignable] ISO C++ 標準の CopyAssignable の要件を満たしている必要があります。

  • Sequencer タイプは Sequencer 要件を満たしている必要があります。Sequencer インスタンスが例外をスローすると動作は未定義になります。

sequencer_node は、メッセージをシーケンス順でサクセサーセットの単一サクセサーに転送します。

sequencer_node は、graph_nodereceiver<T>、および sender<T> です。

sequencer_node から渡される各項目は、シーケンサーの順序番号によって順番が決められます。これらのシーケンス順序番号の範囲は 0 から std::size_t タイプで表現可能な最も大きい整数です。項目のシーケンサー順序は、ユーザーが指定するシーケンサー関数オブジェクトに項目を渡すことで決まります。

sequencer_node は重複するシーケンサー番号を拒否します。

メンバー関数

template<typename Sequencer>
sequencer_node(graph &g, const Sequencer &s)

グラフ g に属する空の sequencer_node を構築し、s を使用して項目のシーケンス番号を計算します。

sequencer_node(const sequencer_node &src)

src と同じグラフ g に属し、src の構築に使用された シーケンサー s のコピーを使用する空の sequencer_node を構築します。先行リスト、後続リスト、およびメッセージ内部はコピーされません。

警告

新しいシーケンサー・オブジェクトは、src の構築時に提供されたオリジナルのシーケンサー・オブジェクトの複製からコピー構築されます。src オブジェクトのメンバー変数に対して行われた変更は、新しい sequencer_node. のシーケンサーには影響しません。

bool try_put(const T &v)

vsequencer_node に追加し、シーケンス内の次の項目をサクセサーに転送します。

戻り値: true

bool try_get(T &v)

戻り値: シーケンスの次の項目が sequencer_node で利用可能な場合は true を返します。存在する場合、ノードから削除して v に割り当てられます。シーケンサー順で次の項目を利用できない場合、またはノードが予約されている場合は、false を返します。

デダクション・ガイド


template <typename Body> 
sequencer_node(graph&, Body) -> input_node<std::decay_t<input_t<Body>>>;

説明:

  • input_tBody 入力引数タイプのエイリアスです。

この例は、sequencer_node の順序付け機能を示します。並列に処理される間、データはリードされた順番でサクセサーノードに渡されます。


#include "oneapi/tbb/flow_graph.h" 

struct Message { 
    int id; 
    int data; 
}; 

int main() { 
    oneapi::tbb::flow::graph g; 

    // Due to parallelism the node can push messages to its successors in any order 
    oneapi::tbb::flow::function_node< Message, Message >process(g, oneapi::tbb::flow::unlimited, [] (Message msg) -> Message { 
        msg.data++; 
        return msg; 
    }); 

    oneapi::tbb::flow::sequencer_node< Message >ordering(g, [](const Message& msg) -> int { 
        return msg.id; 
    });
 
    oneapi::tbb::flow::function_node< Message > writer(g, oneapi::tbb::flow::serial, [] (const Message& msg) { 
        printf("Message recieved with id: %d\n", msg.id); 
    }); 

    oneapi::tbb::flow::make_edge(process, ordering); 
    oneapi::tbb::flow::make_edge(ordering, writer); 

    for (int i = 0; i < 100; ++i) { 
        Message msg = { i, 0 }; 
        process.try_put(msg); 
    }
 
    g.wait_for_all(); 
}