2.6.4 atomic 构造
atomic 指令确保更新特定内存位置基本,而不是将其显示在多个,同时写入线程的可能性。 atomic 指令的语法如下所示:
#pragma omp atomic new-line
expression-stmt
表达式语句必须具有以下形式之一:
x binop= expr
x++
++x
x--
--x
在上面的表达式:
x 是用标量类型的一个 lvalue 表达式。
expr 与标量类型的表达式,因此,它不引用 *x.*指定的对象 。
binop 不是重载运算符是一个 +, *, ),/中,, ^,|, << 或 >>。
尽管它实现中定义的实现是否将具有相同的 唯一名称的 重要 指令替换所有 atomic 指令, atomic 指令允许更好的优化。 通常硬件指令可用可将执行原子更新具有最低系统开销。
x 指定的对象仅加载和存储是基本的; expr 的 计算不是原子的。 若要避免争用条件,应并行保护位置的所有更新。 atomic 指令,但知道没有争用条件的功能。
为 atomic 指令的限制如下所示:
- 所有基本对程序中的存储位置 x 需要具有兼容类型。
示例:
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;