次の例では、atomic ディレクティブ (19 ページのセクション 2.6.4) を使用することにより、競合状態 (複数のスレッドにより x の 1 つの要素を同時に更新すること) を回避しています。
#pragma omp parallel for shared(x, y, index, n)
for (i=0; i<n; i++)
{
#pragma omp atomic
x[index[i]] += work1(i);
y[i] += work2(i);
}
この例で atomic ディレクティブを使用する利点は、x の 2 つの異なる要素が並行して更新されることです。 critical ディレクティブ (18 ページのセクション 2.6.2) を代わりに使用した場合、x の要素に対するすべての更新が逐次実行されます (実行順序は保証されません)。
atomic ディレクティブは、直後の C または C++ のステートメントにのみ適用されることに注意してください。 結果として、この例では y の要素はアトミック更新されません。