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;