Compartilhar via


2.6.4 construir atômico

O atomic diretiva garante que um local de memória específica é atualizado atomicamente, em vez de, expondo-as a possibilidade de múltiplas e simultâneas, gravando segmentos.A sintaxe do atomic diretiva é o seguinte:

#pragma omp atomic new-line
   expression-stmt

A instrução de expressão deve ter uma das seguintes formas:

binop x= expr

x + +

+ + x

x-

--x

Nas expressões do anteriores:

  • x é uma expressão lvalue com tipo escalar.

  • expr é uma expressão com um tipo escalar, e não faz referência a objeto designado pelo x.

  • binopnão é um operador sobrecarregado e é um dos +, *, -, /, &, ^, |, <<, ou >>.

Apesar de ser definidos na implementação se uma implementação substitui todas as atomic diretivas com crítica diretivas que tenham as mesmas exclusivo nome, o atomic diretiva permite melhor otimização.Geralmente, as instruções de hardware estão disponíveis que pode realizar a atualização atômica com o menor sobrecarga.

Somente a carga e o armazenamento do objeto designado por x são atômicas; a avaliação de expr não é atômica.Para evitar condições de corrida, todas as atualizações do local em paralelo devem ser protegidas com o atomic diretriz, exceto os que são conhecidos por estar livre de condições de corrida.

Restrições para o atomic diretiva são os seguintes:

  • Todas as referências atômicas para o local de armazenamento x todo o programa serão necessário ter um tipo compatível.

Exemplos:

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;