假设我们有一个包含uint8_t字段的C结构体:
typedef struct foo_s {
uint8_t field;
// other fields...
} foo_t;
如果我们想要使用特定的内存顺序在
field
中原子地存储一个值,C 语言中有哪些可能性?根据我的研究:
- C11 标准 不允许在非原子整数类型中进行原子存储(
atomic_store_explicit
)。此外,在标准中没有保证具有一字节宽度的原子整数类型。 - 另一种可能性(在 C11 中)是使用内存屏障(
atomic_thread_fence
),然后将值存储在field
中。但是,为了使屏障按预期工作,标准要求此存储必须是原子的,因此我们回到了前一项中描述的问题。
所以,解决我们的问题似乎不在 C 标准之内... 是否有常用的机制可以原子地存储一个字节?
请注意,由于 field
属于第三方库,我们无法更改其类型。
atomic_thread_fence(memory_order_seq_cst)
是否有任何帮助?[如果原子操作的文档是针对程序员编写的,那么世界会更美好,我个人认为。] - user3793679