Partilhar via


A.12 Usando a diretiva atomic

O exemplo a seguir evita condições de corrida (atualizações simultâneas de um elemento do x por vários threads) usando o atomic diretiva (seção 2.6.4 na página 19):

#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);
    }

A vantagem de usar o atomic diretiva neste exemplo é que ele permite que as atualizações de dois elementos diferentes de x ocorram em paralelo. Se um critical diretiva (seção 2.6.2 na página 18) foram usados em vez disso, e em seguida, todas as atualizações para elementos de x seria executado em série (embora não de qualquer garantia de ordem).

Observe que o atomic diretiva se aplica apenas à instrução c ou C++ imediatamente a seguir. Como resultado, os elementos de y não são atualizados atomicamente neste exemplo.