0

x86 32/64 位架构

如果在某个对齐的地址下有一条数据,我们同时对它执行读取和写入——来自两个不同的 CPU——但我们不关心它们的顺序。在没有锁和栅栏的情况下这样做是否安全?

具体来说,是否同时执行以下指令不会在 EAX 中出现类似 111...000 的情况?

MOV DWORD PTR [addr], 0xffffffff

MOV DWORD PTR [addr], 0

MOV EAX, DWORD PTR [addr]

哪里addr == 4n

如果不是,那 unalignedaddr呢?

另外切换到64位怎么样?

4

1 回答 1

2

来自英特尔手册,第 3 卷,第 8.1.1 节(“保证的原子操作”):

Intel486 处理器(以及之后的更新处理器)保证以下基本内存操作将始终以原子方式执行:

  • 读取或写入一个字节
  • 读取或写入在 16 位边界上对齐的字
  • 读取或写入在 32 位边界上对齐的双字

Pentium 处理器(以及之后的更新处理器)保证以下额外的内存操作将始终以原子方式执行:

  • 读取或写入在 64 位边界上对齐的四字
  • 对适合 32 位数据总线的未缓存内存位置进行 16 位访问

P6 系列处理器(以及之后的更新处理器)保证以下附加内存操作将始终以原子方式执行:

  • 对适合高速缓存行的高速缓存内存进行未对齐的 16、32 和 64 位访问
于 2013-09-22T10:56:00.603 回答