x86 32/64位架构
如果在某个对齐的地址下有一段数据,我们同时从两个不同的CPU执行读写操作 - 但我们并不关心这些数据的顺序。没有锁和围栏这样做是否安全?
具体来说,同时执行以下说明而不是在EAX中出现类似111 ... 000的情况?
MOV DWORD PTR [addr], 0xffffffff
MOV DWORD PTR [addr], 0
MOV EAX, DWORD PTR [addr]
其中addr == 4n
。
如果没有,那么未对齐addr
呢?
那么切换到64位呢?
答案 0 :(得分:2)
从英特尔手册第3卷8.1.1(“保证原子操作”):
Intel486处理器(以及之后的新处理器)保证以下基本内存操作始终以原子方式执行:
- 读取或写入字节
- 读取或写入在16位边界上对齐的字
- 读取或写入在32位边界上对齐的双字
奔腾处理器(以及更新的处理器)保证以下额外的内存操作将始终以原子方式执行:
- 读取或写入在64位边界上对齐的四字
- 16位访问适合32位数据总线的未缓存内存位置
P6系列处理器(以及之后的新处理器)保证以下额外的内存操作将始终以原子方式执行:
- 对缓存线内的高速缓存行的16位,32位和64位未对齐访问