c++11 - cpu如何使用'mfence'来保护顺序一致性?
问题描述
我想知道cpu如何使用'mfence'来保护顺序一致性,谁能告诉我?
解决方案
为了对齐加载和存储的顺序一致性,在 x86 上使用指令跟随每个存储就足够了。mfence
但是,这不是必需的:更激进的方法只需要确保一条mfence
指令出现在每对可能的存储和后续加载指令之间。例如,一系列未被加载中断的存储指令mfence
除了在最终存储之后不需要任何指令。
如果您想以原子方式执行复合操作(例如递增值),您需要的不仅仅是mfence
- 您需要锁定指令,例如lock inc
. 这也意味着与 相同的障碍mfence
,因此在这种情况下不需要额外的障碍。
在实践中,mfence
即使是普通存储目的,也可能不是强制执行顺序一致性的理想选择,因为它的性能似乎比锁定操作差,因此lock xchg
可以使用例如代替它。