InterlockedExchange和内存对齐

8 x86 winapi multithreading interlocked

我很困惑,微软表示InterlockedExchange需要内存对齐,但是,英特尔文档说LOCK不需要内存对齐.我错过了什么,或者其他什么?谢谢

来自Microsoft MSDN Library

Platform SDK:DLL,进程和线程InterlockedExchange

Target参数指向的变量必须在32位边界上对齐 ; 否则,此函数将在多处理器x86系统和任何非x86系统上出现不可预测的行为.

来自英特尔软件开发人员手册;

  • LOCK指令在执行伴随指令期间使处理器的LOCK#信号有效(将指令转换为原子指令).在多处理器环境中,LOCK#信号确保处理器在信号被置位时独占使用任何共享存储器.

    LOCK前缀的完整性不受存储器字段对齐的影响. 对于任意未对齐的字段,观察到存储器锁定.

  • P6中的内存排序和更新的处理器系列

    锁定的指令有一个总订单.

  • 软件控制总线锁定

    总线锁的完整性不受存储器字段对齐的影响.遵循LOCK语义以获得更新整个操作数所需的多个总线周期.但是,建议锁定访问在其自然边界上对齐,以获得更好的系统性能:•8位访问的任何边界(锁定或其他).•锁定字访问的16位边界.•锁定双字访问的32位边界.•锁定四字访问的64位边界.

Chr*_*odd 6

曾几何时,Microsoft在x86以外的处理器上支持WindowsNT,例如MIPS,PowerPC和Alpha.这些处理器都需要对齐其互锁指令,因此Microsoft在其规范中提出了要求,以确保这些原语可以移植到不同的体系结构中.


小智 1

尽管锁前缀不需要内存对齐,并且可能用于实现 InterlockedExchange() 的 cmpxchg 操作不需要对齐,但如果操作系统启用了对齐检查,那么 cmpxchg 将引发对齐检查异常(AC ) 当使用未对齐的操作数执行时。检查 cmpxchg 和类似文档,查看保护模式异常列表。我不确定 Windows 是否启用对齐检查,但这并不会让我感到惊讶。