Jay*_*y D 8 c c++ x86 assembly memory-fences
我有一套xchg
基于测试的装配锁.我的问题是:
使用指令时是否需要使用内存防护(mfence
,sfence
或lfence
)xchg
?
编辑:
64位平台:采用Intel nehalem
mar*_*kgz 13
根据第8章总线锁定的的英特尔64和IA-32架构软件开发手册,卷3A
内存排序模型可防止使用先前或稍后执行的锁定指令重新排序加载和存储.
因此,锁定的XCHG
指令充当存储器屏障,并且不需要额外的屏障.
Jen*_*edt 13
正如在其他答案中所说,锁定前缀是隐含的,这里,因此在汇编程序级别上没有问题.当您将其用作内联汇编程序时,问题可能在于C(或C++)级别.在这里,您必须确保编译器不会重新排序与您相关的指令xchg
.如果您使用gcc(或表兄弟),您通常会执行以下操作:
__asm__ __volatile__("xchgl %1, %0"
: "=r"(ret)
: "m"(*point), "0"(ret)
: "memory");
Run Code Online (Sandbox Code Playgroud)
这是将指令声明为volatile 并添加"memory"clobber.
xchg
保证编号可以编译成某种东西,这将确保硬件级别的一致性.
归档时间: |
|
查看次数: |
3158 次 |
最近记录: |