2.6.4 Atomowej konstrukcja
atomic Dyrektywa zapewnia, w sposób atomowy, zaktualizowane lokalizacji pamięci, zamiast narażania jej możliwości wiele równoczesnych wątków pisania.Składnia atomic dyrektywy jest następująca:
#pragma omp atomic new-line
expression-stmt
Instrukcja wyrażenia musi mieć jedną z następujących form:
x binop= wyrażenie
x ++
++ x
x--
--x
W poprzednim wyrażeń:
x jest wyrażeniem lvalue typu skalarnych.
wyrażenie jest wyrażenie typu skalarne, a nie odwołuje się obiekt, wyznaczony przez x.
binopnie jest przeciążony operator i jest jednym z +, *, -, / &, ^, |, <<, lub >>.
Chociaż jest zdefiniowane w implementacji czy implementacja zamienia wszystkie atomic dyrektyw z krytyczny dyrektyw, które mają taki sam unikatowy Nazwa, atomic dyrektywy zezwoleń lepszej optymalizacji.Dostępne są często instrukcje sprzętu, może wykonać aktualizację Atomowej z co najmniej napowietrznej.
Obciążenia i magazynu obiekcie wyznaczonym przez x są Atomowej; Ocena wyrażenie nie jest Atomowej.Aby uniknąć wyścigu, powinny być chronione wszystkie aktualizacje lokalizacji równolegle z atomic dyrektywy, z wyjątkiem tych, które są znane jako wolne od wyścigu.
Ograniczenia do atomic dyrektywy są w następujący sposób:
- Wszystkie odwołania Atomowej do lokalizacji magazynu x w całym programie, muszą mieć zgodne z typem.
Przykłady:
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;