C中非原子类型的原子操作是原子的吗?

Are atomic operations on non-atomic types in C atomic?

C17 标准指定了一系列原子操作。例如,对 A 类型的原子对象的原子读写修改操作在标准中定义为:

C atomic_fetch_add(volatile A *object, M operand);

但是我们可以在非原子类型上调用 atomic_fetch_add:

static int x;
static int foo(void *arg) {
  atomic_fetch_add(&x, 3);
}

我的问题:上面atomic_fetch_add对非原子对象x的操作保证是原子的吗?

on an atomic object of type A is defined in the standard

But we can call

is the above atomic_fetch_add operation on the non-atomic object x guaranteed to be atomic?

没有。在标准中,您提供的代码的行为没有定义,没有任何形式的保证。

Real-life 例如,在 clang 上你会得到一个错误。