Assembly 无锁无序读写安全

Assembly 无锁无序读写安全,assembly,x86,multiprocessing,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位怎么样?摘自《英特尔手

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位怎么样?

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

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

  • 读或写一个字节
  • 读或写在16位边界上对齐的字
  • 读取或写入在32位边界上对齐的双字
奔腾处理器(以及此后更新的处理器)保证始终以原子方式执行以下附加内存操作:

  • 读取或写入64位边界上对齐的四字
  • 对32位数据总线中未缓存内存位置的16位访问
P6系列处理器(以及此后更新的处理器)保证始终以原子方式执行以下附加内存操作:

  • 对适合缓存线的缓存内存进行未对齐的16、32和64位访问

我知道这一点。但我不知道如何在多CPU系统上解释它。从单个CPU的角度来看,它是否可以是原子的,但同时从两个不同的CPU访问内存时仍然可以混合使用?@Number47:atomic的意思是原子的。要么全有,要么一无所有。这并不意味着“一点点原子化”,或者“一些位可以原子化地改变”。如果有帮助的话,第8节被称为“多处理器管理”。@Number47:当然。如果你真的想以一种你需要了解这些保证的方式来编程,你一定要花一些时间阅读硬件手册。不管它值多少钱,我也觉得这本书读起来很有趣。