【发布时间】:2017-12-12 17:18:17
【问题描述】:
我最近一直在阅读有关内存重新排序的内容。我的问题是关于多线程场景。考虑下面的例子:
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(假设底层锁实现使用内存屏障并确保锁是只有在所有先前的加载和存储在所有处理器内核上都可见后才释放)。
谢谢
【问题讨论】:
标签: multithreading memory strict-weak-ordering