我很困惑微软说 InterlockedExchange 需要内存对齐,但是英特尔文档说 LOCK 不需要内存对齐。我错过了什么,还是什么?谢谢
来自 Microsoft MSDN 库
平台 SDK:DLL、进程和线程 InterlockedExchange
Target 参数指向的变量必须在 32 位边界上对齐;否则,此函数在多处理器 x86 系统和任何非 x86 系统上的行为将无法预测。
来自英特尔软件开发人员手册;
LOCK 指令 使处理器的 LOCK# 信号在伴随指令的执行期间被断言(将指令变成原子指令)。在多处理器环境中,LOCK# 信号确保处理器在信号被断言时独占使用任何共享内存。
LOCK 前缀的完整性不受内存字段对齐的影响。 对于任意未对齐的字段,会观察到内存锁定。
P6 和更新的处理器系列中的内存排序
锁定指令有一个总顺序。
软件控制总线锁定
总线锁的完整性不受内存字段对齐的影响。LOCK 语义遵循更新整个操作数所需的尽可能多的总线周期。但是,建议锁定访问在其自然边界上对齐以获得更好的系统性能: • 8 位访问的任何边界(锁定或其他)。•锁定字访问的16 位边界。• 锁定双字访问的32 位边界。• 锁定四字访问的64 位边界。