T 型のメッセージの無制限バッファー。メッセージは優先度順に転送されます。
template< typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T> > class priority_queue_node;
#include "tbb/flow_graph.h"
priority_queue_node は、サクセサーセットの 1 つのサクセサーへ優先度順にメッセージを転送する graph_node、receiver<T>、sender<T> です。ノードに登録された順番で、サクセサーにメッセージが転送されます。サクセサーがメッセージを拒否すると、そのサクセサーはメッセージ・パッシング・プロトコルのポリシーに従ってサクセサーリストから削除され、セットの次のサクセサーが処理されます。これはサクセサーがメッセージを受け付けるまで、またはすべてのサクセサーが処理されるまで続行されます。サクセサーに転送されたアイテムはバッファーから削除されます。
Compare で決定された最も優先度の高いメッセージが次に転送されます。
priority_queue_node は予約可能で、一度に 1 つの予約をサポートします。priority_queue_node が予約されている間、ほかのアイテムはサクセサーに転送されず、try_get の呼び出しは false を返します。予約されている間も、try_put は true を返し、priority_queue_node にアイテムを追加します。
A 型のアロケーターが、priority_queue_node に内部メモリーを割り当てるために使用されます。
T は、コピー構築可能および代入可能でなければなりません。
サクセサーがメッセージを拒否した場合、「メッセージ・パッシング・プロトコル」で説明されているプロトコルを使用して処理されます。
Compare 関数オブジェクトは例外をスローしてはなりません。
使用シナリオは、sequencer_node に似ています。ただし、priority_queue_node は、ローカル順序を提供し、その時点で格納されている中から最も優先度の高いメッセージを渡す一方、sequencer_node は、グローバル順序を適用し、「優先度の低い」メッセージが優先度の高いすべてのメッセージよりも先に渡されることはありません。
namespace tbb { namespace flow { template< typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> class priority_queue_node : public queue_node<T> { public: typedef size_t size_type; explicit priority_queue_node( graph &g ); priority_queue_node( const priority_queue_node &src ); ~priority_queue_node(); // 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( ); }; } }
メンバー | 説明 |
---|---|
explicit priority_queue_node( graph &g ) | graph g に属する空の priority_queue_node を構築します。 |
priority_queue_node( const priority_queue_node &src ) | src と同じ graph g に属する空の priority_queue_node を構築します。プレデセッサーのリスト、サクセサーのリスト、バッファーのメッセージはコピーされません。 |
bool try_put( const input_type &v ) | priority_queue_node に v を追加します。v の優先度が現在バッファーに格納されているすべてのメッセージで最も高い場合、アイテムをサクセサーに転送するタスクがキューにスポーンされます。 戻り値: true。 |
bool register_predecessor( predecessor_type &p ) | 値を拒否しないため、プレデセッサーのリストを維持する必要はありません。 戻り値: false。 |
bool remove_predecessor( predecessor_type &p ) | 値を拒否しないため、プレデセッサーのリストを維持する必要はありません。 戻り値: false。 |
bool register_successor( successor_type &r ) | サクセサーのセットに r を追加します。 戻り値: true。 |
bool remove_successor( successor_type &r ) | サクセサーのセットから r を削除します。 戻り値: true。 |
bool try_get( output_type &v ) | 戻り値: ノードに利用できるメッセージがありノードが予約されていない場合は true。その他の場合は false。ノードが true を返した場合、最も優先度の高いメッセージが v にコピーされます。 |
bool try_reserve( output_type &v ) | 呼び出しで true が返された場合、ノードは予約され、予約が解除または消費されるまでメッセージは転送されません。 戻り値: ノードに利用できるメッセージがありノードが予約されていない場合は true。その他の場合は false。ノードが true を返した場合、最も優先度の高いメッセージが v にコピーされます。 |
bool try_release( ) | ノードの予約を解除します。最後に成功した try_reserve の呼び出しで返されたアイテムが priority_queue_node に残されます。 戻り値: バッファーが現在予約されている場合は true。その他の場合は false。 |
bool try_consume( ) | ノードの予約を解除します。最後に成功した try_reserve の呼び出しで返されたアイテムがキューの先頭からポップされます。 戻り値: バッファーが現在予約されている場合は true。その他の場合は false。 |