【发布时间】:2018-08-16 00:30:13
【问题描述】:
我一直在研究 C++ 11 中的内存顺序语义,但在理解 memory_order_acquire 在 CPU 级别如何工作时遇到了一些困难。
根据cppreference;
具有此内存顺序的加载操作执行获取操作 在受影响的内存位置上:当前没有读取或写入 线程可以在此加载之前重新排序。其他线程中的所有写入 释放相同的原子变量在当前可见 线程(请参阅下面的 Release-Acquire 顺序)
我真的无法理解的部分是;
当前线程中的任何读取或写入都不能在此之前重新排序 加载。
如果 CPU 在到达 'memory_order_acquire' 部分之前已经对命令进行了重新排序,会发生什么? CPU 是否恢复所有已完成的工作?这如何保证?
谢谢。
【问题讨论】:
-
我认为您可能误解了该行。这意味着以后的读/写不能重新排序,以便它们在此加载之前发生。并不是说早期的读/写不能相对于彼此重新排序
标签: c++ multithreading c++11 cpu memory-barriers