write_once_node
[flow_graph.write_once_node]
上書きできない単一項目のバッファーのノードです。
// <oneapi/tbb/flow_graph.h> ヘッダーで定義
namespace oneapi {
namespace tbb {
namespace flow {
template< typename T >
class write_once_node : public graph_node, public receiver<T>, public sender<T> {
public:
explicit write_once_node( graph &g );
write_once_node( const write_once_node &src );
~write_once_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 つの項目をバッファーします。初期の値は無効です。ノードから取得した値は破棄されません。
write_once_node
は、graph_node
、receiver<T>
、および sender<T>
です。
write_once_node
には、バッファリング と broadcast-push プロパティーがあります。
write_once_node
は単一項目バッファーの上書きを許可しません。
メンバー関数
- explicit write_once_node(graph &g)
無効な内部バッファー項目を含むグラフ
g
に属するwrite_once_node
タイプのオブジェクトを構築します。
- write_once_node(const write_once_node &src)
無効な内部バッファー項目を含む
write_once_node
タイプのオブジェクトを構築します。バッファーに格納される値とサクセサーのリストはsrc
からコピーされません。
- ~write_once_node()
write_once_node
を破棄します。
- bool try_put(const T &v)
内部の 1 項目のバッファーに有効な値が含まれていない場合、
v
を格納します。新しい値が設定されるとノードはすべてのサクセサーにその値をブロードキャストします。戻り値: 構築後または
clear()
の最初の呼び出しにはtrue
、それ以外はfalse
を返します。
- bool try_get(T &v)
内部バッファーが有効な場合、値を
v
に代入します。戻り値:
v
が割り当てられている場合はtrue
、それ以外はfalse
を返します。
- bool is_valid()
戻り値: バッファーが有効な値を保持している場合は
true
、それ以外はfalse
を返します。
- void clear()
バッファーで保持されている値を無効にします。
例
利用シナリオは overwrite_node に似ていますが、内部バッファーは clear()
呼び出し後にのみ更新されます。次の例は、ノードを予約済みの join_node
に接続して、サクセサーノードの本体から try_get()
メソッドを直接呼び出さないようにする方法を示します。
#include "oneapi/tbb/flow_graph.h"
typedef int data_type;
int main() {
using namespace oneapi::tbb::flow;
graph g;
function_node<data_type, data_type> static_result_computer_n(
g, serial,
[&](const data_type& msg) {
// compute the result using incoming message and pass it further, e.g.:
data_type result = data_type((msg << 2 + 3) / 4);
return result;
});
write_once_node<data_type> write_once_n(g); // for buffering once computed value
buffer_node<data_type> buffer_n(g);
join_node<tuple<data_type, data_type>, reserving> join_n(g);
function_node<tuple<data_type, data_type>> consumer_n(
g, unlimited,
[&](const tuple<data_type, data_type>& arg) {
// use the precomputed static result along with dynamic data
data_type precomputed_result = get<0>(arg);
data_type dynamic_data = get<1>(arg);
});
make_edge(static_result_computer_n, write_once_n);
make_edge(write_once_n, input_port<0>(join_n));
make_edge(buffer_n, input_port<1>(join_n));
make_edge(join_n, consumer_n);
// do one-time calculation that will be reused many times further in the graph
static_result_computer_n.try_put(1);
for (int i = 0; i < 100; i++) {
buffer_n.try_put(1);
}
g.wait_for_all();
return 0;
}