原子性在32/64位

时间:2010-06-26 09:09:47

标签: multithreading atomicity

问题是64位加载/存储操作何时被认为是原子操作。

  • 如果我有64位处理器,但我使用的是32位操作系统。我有64位原子性吗?
  • 如果我使用64位操作系统但运行32位应用程序(使用WoW64),我会有64位原子性吗?

3 个答案:

答案 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;