没有锁的无序读写安全性

时间:2013-09-22 10:43:58

标签: assembly x86 multiprocessing

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位呢?

1 个答案:

答案 0 :(得分:2)

从英特尔手册第3卷8.1.1(“保证原子操作”):

  

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

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

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

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

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

     
      
  • 对缓存线内的高速缓存行的16位,32位和64位未对齐访问
  •