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_nodereceiver<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; 
}