x86架构下Acquire-release能否禁止Load与Store重排场景?
Intel x86架构下Load与早期Store重排及Acquire-Release语义分析
《Intel手册卷3》中有一个Load与早期Store重排的典型示例:
初始状态:x = y = 0
核心1执行代码:
mov [x], 1 mov r2, [y]
核心2执行代码:
mov [y], 1 mov r1, [x]
这种情况下,可能出现r1 = r2 = 0的结果。
问题:使用Acquire-Release语义能否禁止该场景?
在x86架构中,普通Store操作本身就具备release store的语义,因此答案是否定的。我们可以通过以下示例验证:
核心1执行代码:
release(mov [x], 1) mov r2, [y]
核心2执行代码:
mov [y], 1 acquire(mov r1, [x])
从C11标准内存模型规范的角度分析:如果acquire(mov r1, [x])读取到0,只能得出release(mov [x], 1)与acquire(mov r1, [x])不存在**synchronized-with(同步于)**关系,且无法保证禁止核心2中mov [y], 1与acquire(mov r1, [x])的指令重排。
内容的提问来源于stack exchange,提问作者Some Name
相关产品推荐
相关产品推荐

