ノードに渡されるメッセージの数をカウントおよび制限するノード。
template < typename T > class limiter_node;
#include "tbb/flow_graph.h"
limiter_node は、メッセージをすべての後続 (successor) にブロードキャストする graph_node、receiver<T>、sender<T> です。 ブロードキャストする数のカウンター C を維持して、ユーザー定義の threshold に達すると、新しいメッセージを受け付けなくなります。 ブロードキャスト C の内部カウントは、continue_receiver decrement を使用してデクリメントできます。
limiter_node の try_put 呼び出しの動作を下記に示します。
|
カウンター C の値 |
bool try_put( const input_type &v ) |
|---|---|
|
C < しきい値の場合 |
C がインクリメントされ、v がすべての後続にブロードキャストされます。 メッセージを受け付ける後続がなかった場合、C はデクリメントされます。 メッセージが少なくとも 1 つの後続にブロードキャストされた場合は true、その他の場合は false を返します。 |
|
C == しきい値の場合 |
false を返します。 |
try_put がメンバー・オブジェクト decrement で呼び出されると、limiter_node は既知の先行 (predecessor) の 1 つからメッセージを取得して、そのメッセージをすべての後続に転送しようとします。 先行からメッセージを取得できない場合、C をデクリメントします。 後続がメッセージを拒否した場合、および先行からのメッセージの取得に失敗した場合、メッセージ・パッシング・プロトコルを使用して処理されます (詳細は、以下のリンクを参照)。
T は、コピー構築可能および代入可能でなければなりません。
namespace tbb {
namespace flow {
template< typename T >
class limiter_node : public graph_node, public receiver<T>,
public sender<T> {
public:
limiter_node( graph &g, size_t threshold,
int number_of_decrement_predecessors = 0 );
limiter_node( const limiter_node &src );
// continue_receiver
implementation-dependent-type decrement;
// 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( );
};
}
}
| メンバー | 説明 |
|---|---|
| limiter_node( graph &g, size_t threshold, int number_of_decrement_predecessors = 0 ) |
try_put の呼び出しをしきい値 threshold 未満に制限する limiter_node を構築します。 オプションで、number_of_decrement_predecessors 値を提供できます。 この値は、continue_receiver decrement のコンストラクターに渡されます。 |
| limiter_node( const limiter_node &src ) |
src の構築時の状態と同じ初期状態で limiter_node を構築します。 新しい limiter_node は、src と同じ graph g に属し、同じ threshold、同じ初期 number_of_decrement_predecessors が含まれます。 先行のリスト、後続のリスト、ブロードキャストの現在のカウント C は src からコピーされません。 |
| bool try_put( const input_type &v ) |
ブロードキャスト・カウントがしきい値未満の場合、v がすべての後続にブロードキャストされます。 各後続 s について、s.try_put( v ) == false && s.register_predecessor( *this ) == true の場合、s は後続のセットから削除されます。 その他の場合、s は後続のセットに残されます。 戻り値: v がブロードキャストされた場合は true。 しきい値に達したために v がブロードキャストされなかった場合は false。 |
| bool register_predecessor( predecessor_type &p ) |
ブロードキャスト・カウントがしきい値未満になると、先行を追加します。 先行のセットに p を追加します。 戻り値: true。 |
| bool remove_predecessor( predecessor_type &p ) |
先行のセットから p を削除します。 戻り値: true。 |
| bool register_successor( successor_type &r ) |
後続のセットに r を追加します。 戻り値: true。 |
| bool remove_successor( successor_type &r ) |
後続のセットから r を削除します。 戻り値: true。 |
| bool try_get( output_type &v ) |
バッファーは含まれていないため、項目は取得できません。 戻り値: false。 |
| bool try_reserve( output_type &v ) |
予約をサポートしません。 戻り値: false。 |
| bool try_release( ) |
予約をサポートしません。 戻り値: false。 |
| bool try_consume( ) |
予約をサポートしません。 戻り値: false。 |