フローグラフのノードとエッジを制御するクラス。
class graph;
#include "tbb/flow_graph.h"
graph オブジェクトには、フローグラフに基づいて作成されたすべてのタスクとそのノードの親となるルートタスクが含まれます。 ルートタスクにアクセスするメソッド、ルートタスクの子が完了するのを待つメソッド、ルートタスクの参照カウントを明示的にインクリメントまたはデクリメントするメソッド、ルートタスクの子としてタスクを実行するメソッドが提供されます。
関連する graph オブジェクトの wait_for_all を呼び出す前にフローグラフのノードを破棄すると、未定義の動作が発生し、プログラムの実行に失敗します。
graph の実行中にキャンセルされるか例外がスローされると、wait_for_all() 後の状態と一貫性がなくなります。 graph を再度実行する場合は、reset() メソッドを必ず呼び出さなければなりません。
reset() メソッドは、graph の内部状態が初期の状態にリセットされることを保証します。 function_nodes、continue_nodes、source_nodes、multifunction_nodes のユーザーが提供するボディーは reset() では変更されません。ボディーを初期の状態に戻すには、対応するノードを置換するか、ほかの処理を行わなければなりません。
namespace tbb {
namespace flow {
class graph {
public:
graph();
graph(task_group_context& context);
~graph();
void increment_wait_count();
void decrement_wait_count();
template< typename Receiver, typename Body >
void run( Receiver &r, Body body );
template< typename Body >
void run( Body body );
void wait_for_all();
task *root_task();
bool is_cancelled();
bool exception_thrown();
void reset();
};
}
}
| メンバー | 説明 |
|---|---|
| graph([task_group_context& group] ) |
ノードなしでグラフを構築します。group が指定されている場合、グラフのタスクはこのグループで実行されます。 デフォルトでは、グラフはグラフがバインドされているコンテキストで実行されます。 グラフの実行中に生成されるすべてのタスクの親として使用される、empty_task クラスのルートタスクを具体化します。 ルートタスクの ref_count を 1 に設定します。 |
| ~graph() |
グラフの wait_for_all を呼び出して、ルートタスクを破棄します。 |
| void increment_wait_count() |
グラフとまだ対話する外部エンティティーを登録するために使用されます。 ルートタスクの ref_count をインクリメントします。 |
| void decrement_wait_count() |
グラフと対話した外部エンティティーを登録解除するために使用されます。 ルートタスクの ref_count をデクリメントします。 |
| template< typename Receiver, typename Body > void run( Receiver &r, Body body ) |
このメソッドは、ボディーを実行し、その出力を特定のレシーバーに格納するタスクをキューに入れます。 タスクはグラフのルートタスクの子として作成されるため、このタスクが完了するまで wait_for_all はリターンしません。 r.try_put( body() ) を呼び出すタスクをキューに入れます。 タスクが完了するのを待ちません。 キューに入れられるタスクは、ルートタスクの子です。 |
| template< typename Body > void run( Body body ) |
このメソッドは、グラフのルートタスクの子として実行するタスクをキューに入れます。 このキューに入れられたタスクが完了するまで、wait_for_all への呼び出しはリターンしません。 body() を呼び出すタスクをキューに入れます。 タスクが完了するのを待ちません。 |
| void wait_for_all() |
ルートタスクに関連付けられているすべてのタスクが完了するまで待ちます。decrement_wait_count 呼び出しの数は increment_wait_count 呼び出しの数と同じになります。 ルートタスクの wait_for_all を呼び出すため、スレッドを呼び出すとブロック中にワークスチールを行うことになります。 |
| task *root_task() |
戻り値: フローグラフのルートタスクのポインター。 |
| bool is_cancelled() |
戻り値: wait_for_all() の最後の呼び出し中にグラフがキャンセルされた場合は true。その他の場合は false。 キャンセルの説明は、task_group_context を参照してください。 |
| bool exception_thrown() |
戻り値: wait_for_all() の最後の呼び出し中に例外がスローされた場合は true。その他の場合は false。 例外処理の詳細は、「例外」セクションを参照してください。 |
| void reset() |
graph のノードの内部状態を初期の状態にリセットします。 function_nodes、continue_nodes、source_nodes、multifunction_nodes のボディーの状態は変更されません。 キャンセルの説明は、task_group_context を参照してください。 例外処理の詳細は、「例外」セクションを参照してください。 |