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