タスク領域を定義します。
スレッドが task 構造に到達すると、関連付けられた構造ブロックのコードに対するタスクが生成されます。 到達スレッドは、ただちにタスクを実行するか、または実行を保留します。 実行が保留された場合、タスクはチーム内の任意のスレッドに割り当てられます。
タスク領域内のタスク・スケジューリング・ポイントに到達したスレッドは、そのタスク領域を一時的に中断することがあります。 その場合、デフォルトではタスクがバインドされ、中断されたタスク領域はそれを開始したスレッドによってのみ再開できます。 ただし、task 構造で untied 節が指定されている場合は、中断後にチーム内の任意のスレッドでそのタスク領域を再開できます。 次の場合には、untied 節は無視されます。
task 構造は、外側のタスクの中に入れ子されることがありますが、内側タスクのタスク領域は、外側タスクのタスク領域の一部ではありません。
task 構造には、生成されるタスクのタスク領域に (明示的なタスクの生成直後に) タスク・スケジューリング・ポイントがあります。 そして、それぞれの明示的なタスク領域には、その終了ポイントにタスク・スケジューリング・ポイントがあります。 タスク・スケジューリング・ポイントは、untied タスク領域の任意の場所に追加することができます。
明示的なタスク領域によってストレージが共有される場合は、その実行が完了する前にストレージが無効にならないように、適切な同期を追加する必要があります。
プログラムは、task プラグマの節の評価の順序や影響に依存してはなりません。 タスク領域の内側から外側へ、または外側から内側へ分岐するプログラムはサポートされません。
同じユニットの複数のタスクで、同期せずに C++ I/O 文を使用した場合の動作は不定です。
struct node {
struct node *left;
struct node *right;
};
extern void process(struct node *);
int depth, limit;
void traverse( struct node *p ) {
// When depth>limit, stop generating new tasks, and allow the
// compiler to avoid creating a new data environment.
if (p->left)
#pragma omp task final(depth>limit) mergeable
// p is firstprivate by default
traverse(p->left);
if (p->right)
#pragma omp task final(depth>limit) mergeable
// p is firstprivate by default
traverse(p->right);
process(p);
}