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_nodereceiver<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_nodejoin_node をサクセサーとして予約するのをサポートします。write_once_node のサンプルセッションの例を参照してください。