问题是64位加载/存储操作何时被认为是原子操作。
答案 0 :(得分:4)
应用程序必须在64位操作系统和本机64位模式下运行才能获得x64的优势,这一点不足为奇。如果您在32位操作系统(32位应用程序)上运行32位模式,您将获得32位原子性。如果您在64位CPU上的64位操作系统上运行64位模式,您将获得64位原子性。链中的所有组件(app,OS,CPU)必须运行64位才能获得64位。
答案 1 :(得分:3)
重要的是应用程序的32/64“位数” -
即你的64位加载/存储在汇编级别是原子的
你需要一个64位的应用程序才能获得“免费”。*
对于64位应用程序,您需要一个64位CPU和一个可以执行它的操作系统
操作系统可以是任何东西,只要它可以在64位CPU上启动64位进程。
如果我有64位处理器,但我使用的是32位操作系统。我有64位原子性吗?
32位Windows,Linux:即使在64位CPU上,也无法在32位Windows或Linux上运行64位应用程序。
32 bit Mac OS X:如果您的应用程序是64位应用程序,那么是。
如果我使用64位操作系统但运行32位应用程序(使用WoW64),我会有64位原子性吗?
没有。 如果您运行的是32位应用程序,则机器代码级别的加载和存储仍将是32位加载和存储。
*您可以在32位CPU上使用编译器内在函数和/或直接assembly获得64位原子读/写。功能
答案 2 :(得分:3)
默认不是!但是x86下的一些SSE指令支持64bit和128bit原子加载/存储,当然你必须首先确保内存对齐。看看例子:
procedure Move64(var Source, Destination);
//Move 8 bytes atomicly from Source 8-byte aligned to Destination!
asm
movq xmm0, qword [Source]
movq qword [Destination], xmm0
end;
procedure Move64(newData: pointer; newReference: cardinal; var Destination); overload;
//Move 8 bytes atomically into 8-byte Destination!
asm
movd xmm0, eax
movd xmm1, edx
punpckldq xmm0, xmm1
movq qword [Destination], xmm0
end;
procedure Move128(var Source, Destination);
//Move 16 bytes atomicly from Source to 16-byte aligned to Destination!
asm
movdqa xmm0, dqword [Source]
movdqa dqword [Destination], xmm0
end;