原子结构的目的
Purpose of atomic structures
根据 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---which 中的 warning/error 完全没问题 w.r.t。 C11标准。为什么我要将结构限定为 _Atomic
?
一些实现可能能够保证满足特定条件的结构的原子行为。我不知道在 C11 标准发布之前是否确实存在这样做的任何实现,但这看起来肯定是合理的。如果一个实现有效地支持这样的结构,标准要求将它们视为约束违规将是相当烦人的。
如果标准强制要求,或者至少建议,实现将任何定义原子结构的尝试视为约束违反,这将是有帮助的他们不能为其提供适当的语义,但无论出于何种原因,该标准的作者似乎极不愿意承认一类程序会被某些实现拒绝,但在不拒绝它的实现上定义了行为。一个好的标准应该寻求最大限度地增加属于该类别的有用程序的数量,但该标准反而倾向于将某些实现支持而其他实现不支持的构造视为未定义行为,让实现在闲暇时支持或不支持它们,但未提供任何安全方法来确定它们是否受支持。
您不能访问单个成员,但始终可以访问整个结构。我认为,访问本应作为原子单元的部分内容没有多大意义。
原子结构的典型用例是两个指针的组合,例如列表的头部和尾部。要操作这样的 struct
,您必须将当前值从原子复制到临时值,修改它,然后再复制回来。这样一来,您始终可以保证存储的值在任何时候都是一致的。
默认情况下,整个原子 struct
上的所有此类操作都具有顺序一致性。
根据 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---which 中的 warning/error 完全没问题 w.r.t。 C11标准。为什么我要将结构限定为 _Atomic
?
一些实现可能能够保证满足特定条件的结构的原子行为。我不知道在 C11 标准发布之前是否确实存在这样做的任何实现,但这看起来肯定是合理的。如果一个实现有效地支持这样的结构,标准要求将它们视为约束违规将是相当烦人的。
如果标准强制要求,或者至少建议,实现将任何定义原子结构的尝试视为约束违反,这将是有帮助的他们不能为其提供适当的语义,但无论出于何种原因,该标准的作者似乎极不愿意承认一类程序会被某些实现拒绝,但在不拒绝它的实现上定义了行为。一个好的标准应该寻求最大限度地增加属于该类别的有用程序的数量,但该标准反而倾向于将某些实现支持而其他实现不支持的构造视为未定义行为,让实现在闲暇时支持或不支持它们,但未提供任何安全方法来确定它们是否受支持。
您不能访问单个成员,但始终可以访问整个结构。我认为,访问本应作为原子单元的部分内容没有多大意义。
原子结构的典型用例是两个指针的组合,例如列表的头部和尾部。要操作这样的 struct
,您必须将当前值从原子复制到临时值,修改它,然后再复制回来。这样一来,您始终可以保证存储的值在任何时候都是一致的。
默认情况下,整个原子 struct
上的所有此类操作都具有顺序一致性。