我很困惑,微软表示InterlockedExchange需要内存对齐,但是,英特尔文档说LOCK不需要内存对齐.我错过了什么,或者其他什么?谢谢
来自Microsoft MSDN LibraryPlatform SDK:DLL,进程和线程InterlockedExchange
Target参数指向的变量必须在32位边界上对齐 ; 否则,此函数将在多处理器x86系统和任何非x86系统上出现不可预测的行为.
来自英特尔软件开发人员手册;
LOCK指令在执行伴随指令期间使处理器的LOCK#信号有效(将指令转换为原子指令).在多处理器环境中,LOCK#信号确保处理器在信号被置位时独占使用任何共享存储器.
LOCK前缀的完整性不受存储器字段对齐的影响. 对于任意未对齐的字段,观察到存储器锁定.
P6中的内存排序和更新的处理器系列
锁定的指令有一个总订单.
软件控制总线锁定
总线锁的完整性不受存储器字段对齐的影响.遵循LOCK语义以获得更新整个操作数所需的多个总线周期.但是,建议锁定访问在其自然边界上对齐,以获得更好的系统性能:•8位访问的任何边界(锁定或其他).•锁定字访问的16位边界.•锁定双字访问的32位边界.•锁定四字访问的64位边界.
Chris Dodd.. 6
曾几何时,Microsoft在x86以外的处理器上支持WindowsNT,例如MIPS,PowerPC和Alpha.这些处理器都需要对齐其互锁指令,因此Microsoft在其规范中提出了要求,以确保这些原语可以移植到不同的体系结构中.
曾几何时,Microsoft在x86以外的处理器上支持WindowsNT,例如MIPS,PowerPC和Alpha.这些处理器都需要对齐其互锁指令,因此Microsoft在其规范中提出了要求,以确保这些原语可以移植到不同的体系结构中.