基于C++11获取/发布语义,我有以下问题:
获取语义定义:编译器/CPU不应该重新排序在获取之后发生的读取。1.但它能否将在获取语句之后发生的写入重新排序到获取之前?
发布语义定义:编译器/CPU不应该重新排序发布之前发生的写入,而是在发布之后重新排序。2.但它能否重新排序在发布声明之前发生的读到发布后的内容?
示例:
atomic<int> i = 0, j = 0, x = 0;
i = 0;
j = x;
i = 20;
发布于 2016-08-21 09:15:56
我想你转换了获取/发布语义。
来自cpp参考
memory_order_acquire:...在加载之前,不能对当前线程中的任何读取进行重新排序。 memory_order_release:...当前线程中的写入不能在存储后重新排序。
关于你的问题:
但是它能重新排序在获取语句之后发生的写操作到获取之前吗?? 但是它能重新排序在发布声明之前发生的读到发布后的读吗??
通常,是的,只要代码效果没有重新排序,编译器和CPU就可以重新排序指令,以使程序运行得更快。这就是为什么如果需要严格的排序,我们显式地使用atomics +内存顺序和锁。
阻止CPU/Compiler重新排序的一个常见问题是依赖项,例如,查看以下示例:
int a = atomicA.load(std::memory_order_relaxed);
a += 10;
atomicB.store(a,std::memory_order_relaxed);
尽管代码中没有明确说明的排序(松弛的atomics =按您的意愿重新排序),但atomicB
通过a
携带atomicA
的依赖关系,在依赖关系的情况下--即使代码中没有显式排序--执行必须以一种保持该依赖关系的方式进行,在这种情况下,不能在加载之前重新排序存储。
https://stackoverflow.com/questions/39060704
复制相似问题