予約可能な単一アイテムのノード

概要

overwrite_node と write_once_node の予約サポート。

ヘッダー

#define TBB_PREVIEW_RESERVABLE_OVERWRITE_NODE 1
#include "tbb/flow_graph.h"

説明

overwrite_node および write_once_node は、TBB_PREVIEW_RESERVABLE_OVERWRITE_NODE マクロのプレビュー機能として予約をサポートします。この機能がサポートされているかどうかは、TBB_INTERFACE_VERSION>=10001 を確認します。

注意

アプリケーションで予約可能と予約不可能な単一アイテムのノードを混在させることはできません。混在させた場合の動作は不定です。例えば、予約可能なノードを使用するコードがデッドロックになる可能性があります。TBB_PREVIEW_RESERVABLE_OVERWRITE_NODE マクロの同じ値ですべてのモジュールを再コンパイルすることを強く推奨します。

入力バッファー、出力バッファー、予約、および転送ポリシー

ノード

受信ポリシー

try_get()?

try_reserve()?

転送

overwrite_node

accept

broadcast-push

write_once_node

accept once

broadcast-push

メンバー

次の表は、このプレビュー機能の動作を変更する overwrite_node および write_once_node クラスのメンバーの説明です。
メンバー 説明
bool try_reserve( output_type &v )

内部バッファーが有効な場合、値を v に代入します。

戻り値: v が代入された場合は truev が代入されなかった場合は false

bool try_release( output_type &v )

戻り値: true

bool try_consume( output_type &v )

戻り値: true

サンプル

予約可能な overwrite_node の使用例を示します。

#define TBB_PREVIEW_RESERVABLE_OVERWRITE_NODE 1
#include "tbb/flow_graph.h"

#include <cassert>

typedef int data_type;

int main() {
    static int N = 0;

    tbb::flow::graph g;
    
    tbb::flow::overwrite_node< data_type > overwrite_n(g);
    tbb::flow::buffer_node< data_type > buffer_n(g);

    tbb::flow::join_node< tbb::flow::tuple< data_type, data_type >, tbb::flow::reserving > join_n(g);

    tbb::flow::function_node< tbb::flow::tuple<data_type, data_type> > counter_n(g, tbb::flow::unlimited, [&](const tbb::flow::tuple< data_type, data_type >& arg) { ++N; });

    tbb::flow::make_edge(overwrite_n, tbb::flow::input_port< 0 >(join_n));
    tbb::flow::make_edge(buffer_n, tbb::flow::input_port< 1 >(join_n));
    tbb::flow::make_edge(join_n, counter_n);

    overwrite_n.try_put(1);
    for (int i = 0; i < 100; i++) {
        buffer_n.try_put(1);
    }
   
    g.wait_for_all();

    assert(N == 100);

    return 0;
}

関連情報