2.6.4 Construction atomic
La directive d' atomic garantit qu'un emplacement mémoire spécifique est mis à jour atomique, plutôt que l'exposant à la possibilité de plusieurs, simultanés thread d'écriture. La syntaxe de la directive d' atomic est la suivante :
#pragma omp atomic new-line
expression-stmt
L'instruction d'expression doit avoir l'une des formes suivantes :
X binop= expr
x++
++x
x--
--x
dans les expressions précédentes :
X est une expression lvalue avec le type scalaire.
expr est une expression avec le type scalaire, et il ne fait pas référence à l'objet indiqué par le X.
binop n'est pas un opérateur surchargé et possède un ans de +, -, *,/ &, ^, |, <<, ou >>.
Bien qu'il implémentation-soit la valeur si une implémentation remplace toutes les directives d' atomic par les directives de critique qui ont le même nom unique, la directive d' atomic permet une meilleure optimisation. Souvent l'instruction matérielle est disponible que puisse effectuer la mise à jour de façon atomique avec le moins charge mémoire.
Seule la charge et le stockage de l'objet désigné par x sont atomiques ; l'évaluation expr n'est pas atomique. Pour éviter des conditions de concurrence critique, toutes les mises à jour de l'emplacement en parallèle doivent être protégées avec la directive d' atomic , sauf ceux qui sont réputés pour pas avoir de conditions de concurrence critique.
Les restrictions à la directive d' atomic sont les suivantes :
- toutes les références atomiques à l'emplacement de stockage X dans tout le programme sont requises pour avoir un type compatible.
Exemples :
extern float a[], *p = a, b;
/* Protect against races among multiple updates. */
#pragma omp atomic
a[index[i]] += b;
/* Protect against races with updates through a. */
#pragma omp atomic
p[i] -= 1.0f;
extern union {int n; float x;} u;
/* ERROR - References through incompatible types. */
#pragma omp atomic
u.n++;
#pragma omp atomic
u.x -= 1.0f;