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_node
、receiver<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)
v
をsequencer_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_t
はBody
入力引数タイプのエイリアスです。
例
この例は、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();
}