A.12 Utilisation de la directive atomic
L'exemple suivant évite les conditions de concurrence critique (mises à jour simultanée d'un élément de x par plusieurs threads) à l'aide de la directive d' atomic (section 2.6.4 à la page 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);
}
L'avantage d'utiliser la directive d' atomic dans cet exemple est qu'elle permet aux mises à jour de deux éléments différents x de se produire en parallèle. Si une directive d' critical (section 2.6.2 à la page 18) était utilisée à la place, toutes les mises à jour des éléments de x seraient exécutés séquentiel (mais pas dans toute commande garantie).
Notez que la directive d' atomic s'applique uniquement à l'instruction C ou C++ qui suit immédiatement elle. Par conséquent, les éléments de y ne sont pas mis à jour atomique dans cet exemple.