2.6.4 atomic – konstrukce
atomic Směrnice zajišťuje atomicky, aktualizovány konkrétní paměťové místo spíše než vystavíte možnost více souběžných podprocesů psaní.Syntaxe atomic směrnice je následující:
#pragma omp atomic new-line
expression-stmt
Příkaz výrazu musí mít jednu z následujících forem:
x binop= výraz
x ++
++ x
x--
--x
V předchozím výrazy:
x je výraz lvalue skalární typu.
výraz je výraz typu skalární a neobsahuje odkaz na objekt určený x.
binopnení přetíženého operátoru a je jednou z +, *, -, / &, ^, |, <<, nebo >>.
Ačkoli je definované implementací zda implementace nahradí všechny atomic směrnic s kritické směrnic, které se stejným jedinečným název, atomic směrnice lépe povolení optimalizace.Často hardwaru pokyny jsou k dispozici, můžete provést aktualizaci atomovou s nejmenším zatížení.
Zatížení a úložiště objektu určeném x jsou atomovou; hodnocení výraz není atomovou.Chcete-li se vyhnout sporech, by měly být chráněny všechny aktualizace umístění paralelně s atomic směrnice, kromě těch, které jsou známé jako prosté sporech.
Omezení atomic směrnice jsou následující:
- Všechny atomovou odkazy na umístění úložiště x v celém programu musí mít kompatibilní.
Příklady:
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;