вопрос о том, когда делает загрузку и хранение на 64 бита, операции считаются атомарными.
Неудивительно, что приложение должно работать в 64-битной ОС и в собственном 64-битном режиме, чтобы получить преимущества x64. Если вы работаете в 32-битном режиме, либо на 32-битной ОС (с 32-битным приложением), вы получите 32-битную атомарность. Если вы используете 64-битный режим в 64-битной ОС на 64-битном процессоре, вы получите 64-битную атомарность. Все компоненты в цепочке (приложение, ОС, ЦП) должны работать на 64-битной версии, чтобы получить 64-битную версию.
Значение имеет только 32/64 "разрядность" приложения -
то есть ваши 64-битные загрузки / хранилища являются атомарными на уровне сборки.
Чтобы получить это "бесплатно", вам потребуется 64-битное приложение. *
Для 64-битного приложения вам понадобится 64-битный ЦП и ОС, которая может его выполнить.
ОС может быть любой, если она может запускать 64-битный процесс на 64-битном процессоре.
если у меня 64-битный процессор, но я использую 32-битную ОС. Будет ли у меня 64-битная атомарность?
32-битная Windows, Linux: Вы просто не можете запускать 64-битные приложения в 32-битной Windows или Linux, даже на 64-битном процессоре.
32-битная Mac OS X : если ваше приложение является 64-битным, то да.
если я использую 64-битную ОС, но запускаю 32-битное приложение (с использованием WoW64), будет ли у меня 64-битная атомарность?
Нет. Ваши загрузки и сохранения на уровне машинного кода по-прежнему будут 32-битными загрузками и сохранениями, если вы запускаете 32-битное приложение.
* Вы можете получить 64-битные атомарные операции чтения / записи на 32-битном процессоре с помощью встроенных функций компилятора, где они доступны, и / или прямой сборки .
Не по умолчанию! Но некоторые инструкции SSE под x86 поддерживают 64-битную и 128-битную атомарную загрузку / сохранение, конечно, вы должны сначала убедиться в выравнивании памяти. Примеры:
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;