我最近一直在阅读内存重新排序。我的问题是关于多线程场景。考虑下面的例子:
A = 0;
B = 0;
Thread 1 on Processor 1 Thread 2 on Processor 2
A = 100; while(B== 0);
B = 1; //access A here
我一直在 X86-64 Windows 平台上编码,从未考虑过可以重新排序 A 和 B 的存储(在编译器级别或硬件级别),我可能最终在线程 2 中得到 B = 0 并发现 A 仍然存在0. 并且从来没有遇到过这样的代码的任何问题或讨厌的错误。是不是因为 x86-x64 是强排序的,windows C 编译器也是如此。
对于要在具有弱排序内存的任何其他平台上执行这样的代码,我是否需要确保在锁内更新和访问 A 和 B(假设底层锁实现使用内存屏障并确保仅在所有先前的加载和存储在所有处理器内核上都是可见的)。
谢谢