6

在 x86 上,如果 mem 是 32 位对齐的,则 mov 操作保证是原子的。

如果 [mem] 不是 32 位对齐的,lock inc [mem]sill 可以正常工作吗?

工作正常:提供原子性而不是获得部分价值。

4

3 回答 3

8

x86 和 x64的Intel 指令集参考没有提及 INC 指令的对齐要求。它所指的LOCK只是:

该指令可以与 LOCK 前缀一起使用,以允许指令以原子方式执行。

LOCK前缀文档指出:

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

于 2012-07-26T05:12:27.930 回答
2

锁定前缀将为未对齐的内存访问提供原子性。在 QPI 系统上,这可能非常慢。请参阅英特尔网站上的这篇文章:

如何解决同时未对齐的内存访问的错误

http://software.intel.com/en-us/forums/showthread.php?t=75386

于 2012-07-26T05:15:49.787 回答
0

虽然硬件可能对未对齐的访问很好,但代码实现可能依赖于窃取指针的低 2 位或 3 位(对于 32 位或 64 位对齐的指针,始终为零)。

例如,(Win32) InterlockedPushSList 函数不存储指针的低 2 位或 3 位,因此任何推入或弹出未对齐对象的尝试都不会按预期工作。无锁代码通常会将额外信息塞入指针大小的对象中。大多数时候这不是问题。

英特尔的处理器一直具有出色的未对齐访问性能。在 Nehalem (Core I7) 上,他们一路走来:完全在高速缓存行内的任何未对齐访问都没有惩罚,而跨越高速缓存行边界的未对齐访问平均有 4.5 个周期的惩罚 - 非常小。

于 2013-01-21T23:02:56.713 回答