overwrite_node
[flow_graph.overwrite_node]
上書き可能な 1 つの項目のバッファーのノードです。
// <oneapi/tbb/flow_graph.h> ヘッダーで定義
namespace oneapi {
namespace tbb {
namespace flow {
template<typename T>
class overwrite_node : public graph_node, public receiver<T>, public sender<T> {
public:
explicit overwrite_node( graph &g );
overwrite_node( const overwrite_node &src );
~overwrite_node();
bool try_put( const T &v );
bool try_get( T &v );
bool is_valid( );
void clear( );
};
} // namespace flow
} // namespace tbb
} // namespace oneapi
要件:
T
タイプは、[defaultconstructible] の DefaultConstructible の要件と、[copyassignable] ISO C++ 標準の CopyAssignable の要件を満たしている必要があります。
このタイプのノードは、T
タイプの 1 つの項目をバッファーします。初期の値は無効です。ノードから取得した値は破棄されません。
overwrite_node
は、graph_node
、receiver<T>
、および sender<T>
です。
overwrite_node
には、バッファリング と broadcast-push プロパティーがあります。
overwrite_node
は単一項目バッファーの上書きを許可します。
メンバー関数
- explicit overwrite_node(graph &g)
無効な内部バッファー項目を含むグラフ
g
に属するoverwrite_node
タイプのオブジェクトを構築します。
- overwrite_node(const overwrite_node &src)
無効な内部バッファー項目を含むグラフ
g
に属するoverwrite_node
タイプのオブジェクトを構築します。バッファーに格納される値とサクセサーのリストはsrc
からはコピーされません。
- ~overwrite_node()
overwrite_node を破棄します。
- bool try_put(const T &v)
内部の単一項目のバッファーに
v
を格納し、すべてのサクセサーでtry_put(v)
を呼び出します。戻り値:
true
- bool try_get(T &v)
内部バッファーが有効な場合、値を
v
に代入します。戻り値:
v
が割り当てられている場合はtrue
、それ以外はfalse
を返します。
- bool is_valid()
戻り値: バッファーが有効な値を保持している場合は
true
、それ以外はfalse
を返します。
- void clear()
バッファーで保持されている値を無効にします。
例
この例は、overwrite_node
が更新される可能性がある単一のストレージとして使用しています。データは try_get()
を直接呼び出すことでアクセスできます。
#include "oneapi/tbb/flow_graph.h"
int main() {
const int data_limit = 20;
int count = 0;
oneapi::tbb::flow::graph g;
oneapi::tbb::flow::function_node< int, int > data_set_preparation(g,
oneapi::tbb::flow::unlimited, []( int data ) {
printf("Prepare large data set and keep it inside node storage\n");
return data;
});
oneapi::tbb::flow::overwrite_node< int > overwrite_storage(g);
oneapi::tbb::flow::input_node< int > data_generator(g,
[&]( oneapi::tbb::flow_control& fc ) -> int {
if ( count < data_limit ) {
return ++count;
}
fc.stop();
return {};
});
oneapi::tbb::flow::function_node< int > process(g, oneapi::tbb::flow::unlimited,
[&]( const int& data) {
int data_from_storage = 0;
overwrite_storage.try_get(data_from_storage);
printf("Data from a storage: %d\n", data_from_storage);
printf("Data to process: %d\n", data);
});
oneapi::tbb::flow::make_edge(data_set_preparation, overwrite_storage);
oneapi::tbb::flow::make_edge(data_generator, process);
data_set_preparation.try_put(1);
data_generator.activate();
g.wait_for_all();
return 0;
}
overwrite_node
は join_node
をサクセサーとして予約するのをサポートします。write_once_node のサンプルセッションの例を参照してください。