Sdílet prostřednictvím


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;