Udostępnij za pośrednictwem


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;