次の方法で共有


A.12 atomic ディレクティブの使用

次の例では、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 の要素はアトミック更新されません。