首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获取/发布语义重新排序

获取/发布语义重新排序
EN

Stack Overflow用户
提问于 2016-08-21 03:53:03
回答 1查看 342关注 0票数 2

基于C++11获取/发布语义,我有以下问题:

获取语义定义:编译器/CPU不应该重新排序在获取之后发生的读取。1.但它能否将在获取语句之后发生的写入重新排序到获取之前?

发布语义定义:编译器/CPU不应该重新排序发布之前发生的写入,而是在发布之后重新排序。2.但它能否重新排序在发布声明之前发生的读到发布后的内容?

示例:

代码语言:javascript
运行
复制
atomic<int> i = 0, j = 0, x = 0;

i = 0;

j = x;

i = 20;
  1. 编译器/CPU是否会将以上内容重新排序(优化)如下: 原子i= 0,j= 0,x= 0; I= 20; J= x;
  2. 但是,如果我们使用获取负载,编译器/CPU会避免重新排序写入I (i=20)吗? 原子i= 0,j= 0,x= 0; I= 0; 原子j= x.load(memory_order_acquire); I= 20;
EN

回答 1

Stack Overflow用户

发布于 2016-08-21 09:15:56

我想你转换了获取/发布语义。

来自cpp参考

memory_order_acquire:...在加载之前,不能对当前线程中的任何读取进行重新排序。 memory_order_release:...当前线程中的写入不能在存储后重新排序。

关于你的问题:

但是它能重新排序在获取语句之后发生的写操作到获取之前吗?? 但是它能重新排序在发布声明之前发生的读到发布后的读吗??

通常,是的,只要代码效果没有重新排序,编译器和CPU就可以重新排序指令,以使程序运行得更快。这就是为什么如果需要严格的排序,我们显式地使用atomics +内存顺序和锁。

阻止CPU/Compiler重新排序的一个常见问题是依赖项,例如,查看以下示例:

代码语言:javascript
运行
复制
int a = atomicA.load(std::memory_order_relaxed);
a += 10;
atomicB.store(a,std::memory_order_relaxed);

尽管代码中没有明确说明的排序(松弛的atomics =按您的意愿重新排序),但atomicB通过a携带atomicA的依赖关系,在依赖关系的情况下--即使代码中没有显式排序--执行必须以一种保持该依赖关系的方式进行,在这种情况下,不能在加载之前重新排序存储。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39060704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档