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;