Condividi tramite


Costrutto atomico 2.6.4

atomic la direttiva che una determinata posizione di memoria venga aggiornata in modalità atomica, anziché esponendola alla possibilità di più thread e simultanee di scrittura.La sintassi di atomic la direttiva è la seguente:

#pragma omp atomic new-line
   expression-stmt

L'istruzione di espressione deve avere uno dei formati seguenti:

binop x= expr

x++

++x

x--

--x

Nelle espressioni precedenti:

  • x è un'espressione di lvalue con tipo scalare.

  • expr è un'espressione con tipo scalare e non fa riferimento all'oggetto definito da x.

  • binop non è un operatore di overload ed è uno di +, -, *,/, &, ^, |, <<, o >>.

Sebbene sia implementazione-definito se un'implementazione di sostituire tutti atomic direttive con critico direttive con lo stesso univoci nome, atomic la direttiva consente una migliore ottimizzazione.Le istruzioni hardware sono spesso disponibili in grado di eseguire l'aggiornamento in modalità atomica con il minore sovraccarico.

Solo il caricamento e l'archivio dell'oggetto definito da x essere in modalità atomica, la valutazione di expr non è atomico.Per evitare race condition, tutti gli aggiornamenti della posizione in parallelo devono essere protette con atomic direttiva, ad eccezione di quelli che sono noti come escluse da race condition.

Restrizioni a atomic la direttiva è la seguente:

  • Tutti i riferimenti atomici nel percorso di archiviazione x in qualsiasi programma sono necessari avere un tipo compatibile.

Esempi:

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;