首页 > 解决方案 > 原子结构的用途

问题描述

根据 C11 § 6.5.2.3

Accessing a member of an atomic structure or union object results
in undefined behavior.

这是有道理的,因为您通常无法访问整个结构。那么为什么它_Atomic也是一个类型限定符而不仅仅是一个类型说明符呢?

换句话说,一个合格的结构的目的是_Atomic什么?我不允许读取或写入其中的任何元素。

#include <stdatomic.h>

struct {
    int x;
} _Atomic foo;

int main(void) {
    foo.x = 42;     // write error
    return foo.x;   // read error
}

这两种访问foo.x都会导致 GCC/Clang 中的警告/错误——这完全符合 C11 标准。为什么我要限定然后结构为_Atomic

标签: cstructatomicc11

解决方案


您不能访问单个成员,但始终可以访问整个结构。我认为,访问本应成为原子单元的部分内容并没有多大意义。

原子结构的典型用例是两个指针的组合,例如列表的头部和尾部。要操作这样的,struct您必须将当前值从原子复制到临时值,修改它,然后再复制回来。这样一来,您始终可以保证存储的值在任何时候都是一致的。

默认情况下,对整个原子的所有此类操作struct都具有顺序一致性。


推荐阅读