在C语言中,对于非原子类型的原子操作是否具有原子性?

3

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);
}

我的问题是,对于非原子对象x上的atomic_fetch_add操作是否保证是原子的?

1个回答

4

标准中定义了A类型的原子对象

但我们可以调用它

GCC会接受此操作。但是在clang上,你会收到一个错误。

上述对非原子对象x进行的atomic_fetch_add操作是否保证是原子的?

不是。在标准中,未定义所示代码的行为,没有任何保证。https://port70.net/~nsz/c/c11/n1570.html#7.17:

5 在以下概要中:

  • A指代原子类型之一。[...]

然后所有函数都是基于A定义的,就像在https://port70.net/~nsz/c/c11/n1570.html#7.17.7.5p2 中一样:

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

原子类型是带有_Atomic的类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接