MOV
汇编指令足以在x86上执行acquire-release语义。我们不需要LOCK
、栅栏或xchg
等。然而,我很难理解这是如何工作的。英特尔文档Vol 3A第8章指出:
https://software.intel.com/sites/default/files/managed/7c/f1/253668-sdm-vol-3a.pdf
在单处理器(core)系统中: - 读取不与其他读取重排。 - 写入不与旧读取重排。 - 对内存的写入不与其他写入重排,但有以下例外:但这仅适用于单核心。多核心部分似乎没有提到如何强制执行加载:
在多处理器系统中,遵循以下排序原则: - 单个处理器使用与单处理器系统相同的排序原则。 - 单个处理器的写入顺序被所有处理器以相同的顺序观察到。 - 来自单个处理器的写入不与来自其他处理器的写入有序。 - 内存排序服从因果关系(内存排序尊重传递可见性)。 - 处理器之外的任何两个存储都按一致的顺序查看。 - 锁定指令具有总顺序。
那么,
MOV
如何单独实现获取-释放?
MOV
本身不是比使用rel-acq
栅栏更加顺序一致吗?因为它只在非常有限的条件下被重新排序。这让我想起了Herb Sutter很久以前关于SC-DRF内存模型的非常有见地的演讲。 - Dean Seo