インテル® C++ コンパイラー 14.0 ユーザー・リファレンス・ガイド
一度に 1 つのスレッドのみアクセスできるコードブロックを指定します。
スレッドは、チーム内のほかのスレッドが同じ名前のクリティカル・セクションを実行しなくなるまで、クリティカル・セクションの入口で待機します。名前のないクリティカル・セクションはすべて同じ無指定の名前であるとみなされます。
クリティカル・セクション名は、プログラムのグローバル要素です。
次の例は、キューからタスクを削除するキューイング・モデルを示します。 複数のスレッドがキューから同じタスクを削除しないように、タスクを削除する操作はクリティカル・セクションに配置します。
この例には 2 つの独立したキューがあるため、宣言子を使用してそれぞれのキューに xaxis と yaxis という名前を付けて保護しています。
#include <omp.h>
int dequeue(work_queue *a);
void work(int i, work_queue *a);
void critical_example(work_queue *x, work_queue *y)
{
int ix_next, iy_next;
#pragma omp parallel shared(x, y) private(ix_next, iy_next)
{
#pragma omp critical (xaxis)
ix_next = dequeue(x);
work(ix_next, x);
#pragma omp critical (yaxis)
iy_next = dequeue(y);
work(iy_next, y);
}
}