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 |
メンバー | 説明 |
---|---|
bool try_reserve( output_type &v ) | 内部バッファーが有効な場合、値を v に代入します。 戻り値: v が代入された場合は true。v が代入されなかった場合は 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; }