gpt4 book ai didi

c - 以原子方式将值存储在 uint8_t (C)

转载 作者:太空狗 更新时间:2023-10-29 15:09:16 26 4
gpt4 key购买 nike

假设我们有一个包含 uint8_t 字段的 C 结构:

typedef struct foo_s {
uint8_t field;
// other fields...
} foo_t;

如果我们想使用特定的内存顺序在字段 中自动存储一个值,在 C 语言中有哪些可能性?根据我的研究

  • C11 standard不允许非原子整数类型的原子存储 (atomic_store_explicit)。最重要的是,标准中没有保证宽度为一个字节的原子整数类型。
  • 另一种可能性(在 C11 中)是使用内存栅栏 (atomic_thread_fence),然后将值存储在 field 中。但是标准要求这个存储是原子的,以便栅栏按预期工作,所以我们回到上一个项目中描述的问题。

所以我们的问题的解决方案似乎超出了 C 标准...是否有任何常用的原子存储字节的机制?

请注意,我们无法更改字段的类型,因为它属于第三方库。

最佳答案

在 GCC 中,请求的原子存储可以使用 __atomic_store_n 实现,它包含在 Atomics 扩展中并且在字节粒度级​​别工作。海湾合作委员会 documentation for atomic builtins 声明“GCC 允许任何长度为 1、2、4 或 8 字节的整数标量或指针类型”。偷看 implementation显示硬件存储以 4 字节粒度工作,但软件将通过使用比较和交换操作来模拟字节存储(即,确保对字中任何其他字节的并发修改不会丢失)。

我的理解是,原子修改适用于任何整数变量,例如 field - 无需更改其类型或修饰符。

关于c - 以原子方式将值存储在 uint8_t (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24763436/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com