T 型のメッセージの無制限バッファー。メッセージはシーケンス順に転送されます。
template< typename T, typename A = cache_aligned_allocator<T> > class sequencer_node;
#include "tbb/flow_graph.h"
sequencer_node は、サクセサーセットの 1 つのサクセサーへシーケンス順にメッセージを転送する graph_node、receiver<T>、sender<T> です。ノードに登録された順番で、サクセサーにメッセージが転送されます。サクセサーがメッセージを拒否すると、そのサクセサーはメッセージ・パッシング・プロトコルのポリシーに従ってサクセサーリストから削除され、セットの次のサクセサーが処理されます。これはサクセサーがメッセージを受け付けるまで、またはすべてのサクセサーが処理されるまで続行されます。サクセサーに転送されたアイテムはバッファーから削除されます。
sequencer_node から渡される各アイテムは、シーケンサーのオーダー番号によって順序が決められます。これらのシーケンスオーダー番号の範囲は 0 から N (N は size_t 型で表現可能な最も大きな整数) です。アイテムのシーケンサー・オーダー番号は、下記のように、シーケンサー・コンセプトをモデル化するユーザー定義関数オブジェクトにアイテムを渡すことにより決定されます。
sequencer_node は、重複するシーケンサー番号を拒否します。
擬似署名 |
意味 |
---|---|
S::S( const S& ) |
コピー・コンストラクター。 |
S::~S() |
デストラクター。 |
void operator=( const S& ) |
代入。擬似署名の戻り型 void は、operator= は値を返す必要がないことを示します。operator= は値を返すことができますが無視されます。 |
size_t S::operator()( const T &v )> |
提供されたメッセージ v のシーケンス番号を返します。 |
sequencer_node は予約可能で、一度に 1 つの予約をサポートします。sequencer_node が予約されている間、ほかのアイテムはサクセサーに転送されず、try_get の呼び出しは false を返します。予約されている間も、try_put は true を返し、sequencer_node にアイテムを追加します。
A 型のアロケーターが、sequencer_node に内部メモリーを割り当てるために使用されます。
T は、コピー構築可能および代入可能でなければなりません。
サクセサーがメッセージを拒否した場合、「メッセージ・パッシング・プロトコル」で説明されているプロトコルを使用して処理されます。
namespace tbb { namespace flow { template< typename T, typename A = cache_aligned_allocator<T> > class sequencer_node : public queue_node<T> { public: template< typename Sequencer > sequencer_node( graph &g, const Sequencer &s ); sequencer_node( const sequencer_node &src ); // receiver<T> typedef T input_type; typedef sender<input_type> predecessor_type; bool try_put( const input_type &v ); bool register_predecessor( predecessor_type &p ); bool remove_predecessor( predecessor_type &p ); // sender<T> typedef T output_type; typedef receiver<output_type> successor_type; bool register_successor( successor_type &r ); bool remove_successor( successor_type &r ); bool try_get( output_type &v ); bool try_reserve( output_type &v ); bool try_release( ); bool try_consume( ); }; } }
メンバー | 説明 |
---|---|
template<typename Sequencer> sequencer_node( graph& g, const Sequencer &s ) |
graph g に属し、アイテムのシーケンス番号の計算に s を使用する空の sequencer_node を構築します。 注意Sequencer 関数オブジェクトは例外をスローしてはなりません。 |
sequencer_node( const sequencer_node &src ) |
src と同じ graph g に属し、src の構築に使用された Sequencer s のコピーを使用する空の sequencer_node を構築します。プレデセッサーのリスト、サクセサーのリスト、バッファーのメッセージはコピーされません。 注意新しいシーケンサー・オブジェクトは、src の構築時に提供されたオリジナルのシーケンサーのコピーからコピー構築されます。このため、src のオブジェクトのメンバー変数に対して行われた変更は、新しい sequencer_node のシーケンサーに影響しません。 |
bool try_put( const input_type &v ) |
sequencer_node に v を追加します。v のシーケンス番号がシーケンスの次のアイテムの場合、アイテムをサクセサーに転送するタスクがスポーンされます。 戻り値: true。 |
bool register_predecessor( predecessor_type &p ) |
sequencer_node は処理を拒否することがありますが、sequencer_node へのフローが逆になることはないため、プレデセッサーのリストを維持する必要はありません。 戻り値: false。 |
bool remove_predecessor( predecessor_type &p ) |
sequencer_node は処理を拒否することがありますが、sequencer_node へのフローが逆になることはないため、プレデセッサーのリストを維持する必要はありません。 戻り値: false。 |
bool register_successor( successor_type &r ) |
サクセサーのセットに r を追加します。 戻り値: true。 |
bool remove_successor( successor_type &r ) |
サクセサーのセットから r を削除します。 戻り値: true。 |
bool try_get( output_type &v ) |
戻り値: シーケンスの次のアイテムが sequencer_node で利用可能な場合は true。その場合、そのアイテムはノードから削除され、v に代入されます。シーケンサー・オーダーの次のアイテムが利用できない場合、またはノードが予約されている場合は false。 |
bool try_reserve( output_type &v ) |
呼び出しで true が返された場合、ノードは予約され、予約が解除または消費されるまでメッセージは転送されません。 戻り値: シーケンサー・オーダーの次のアイテムが sequencer_node で利用可能な場合は true。その場合、そのアイテムは v に代入されますが、sequencer_node から削除されません。シーケンサー・オーダーの次のアイテムが利用できない場合、またはノードが予約されている場合は false。 |
bool try_release( ) |
ノードの予約を解除します。最後に成功した try_reserve の呼び出しで返されたアイテムが sequencer_node に残されます。 戻り値: バッファーが現在予約されている場合は true。その他の場合は false。 |
bool try_consume( ) |
ノードの予約を解除します。最後に成功した try_reserve の呼び出しで返されたアイテムがキューの先頭からポップされます。 戻り値: バッファーが現在予約されている場合は true。その他の場合は false。 |