加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

在uint8_t(C)中以原子方式存储值

发布时间:2020-12-14 02:16:03 所属栏目:Windows 来源:网络整理
导读:假设我们有一个包含uint8_t字段的C结构: typedef struct foo_s { uint8_t field; // other fields...} foo_t; 如果我们想使用特定的内存顺序以原子方式在字段中存储值,那么C语言中的可能性是什么?从我的研究 C11 standard不允许非原子整数类型的原子库(ato
假设我们有一个包含uint8_t字段的C结构:

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

如果我们想使用特定的内存顺序以原子方式在字段中存储值,那么C语言中的可能性是什么?从我的研究

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

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

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

解决方法

在GCC中,要求的原子存储可以使用__atomic_store_n来实现,它包含在Atomics扩展中,并且在一个字节的粒度级别上工作.原子内置的GCC documentation声明“GCC允许任何长度为1,2,4或8个字节的整数标量或指针类型”.查看 implementation显示HW存储以4字节粒度工作,但SW将通过使用比较和交换操作来模拟字节存储(即,确保对字中任何其他字节的并发修改不会丢失).

我的理解是原子修改可以在任何整数变量(如field)中工作 – 不需要更改其类型或修饰符.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读