Являются ли чтение / запись 64-битных значений атомарными на 64-битном процессоре?

2

На 32-разрядных компьютерах чтение и запись 64-разрядных значений в .net раньше были неатомарными, т.е. при чтении я мог прочитать значение, которое никогда не записывалось в память, состоящее из одной более старой 32-разрядной половины, и одна новая половина.

  1. Но являются ли операции чтения/записи атомарными на 64-битных процессорах?
  2. Если да, то должна ли ОС (Windows) быть 64-битной?
  3. И если да, то должно ли даже приложение быть 64-битной сборкой .net?
  • 0
    Я понятия не имею о 1, но могу сказать, что 2 и 3 обязательны. Вам нужно 64-битное приложение в 64-битной ОС в 64-битном процессоре
  • 0
    Код .NET Apps / MSIL по умолчанию не зависит от разрядности. Это означает, что тот же IL может выполняться как x32 или x64. И даже x128 и x16, если мы когда-нибудь получим runtiems для них. Но вам нужна операционная система x64 (которая требует аппаратного обеспечения x64) для выполнения программы x64. Обычно windows поддерживает «один шаг двоичной системы вниз». Как и в системах x32, все еще поддерживаются программы x16. И вы можете настроить программы IL на запуск только в определенных двоичных файлах в опциях сборки проекта / решения.
Показать ещё 7 комментариев
Теги:
atomic
32bit-64bit

1 ответ

2
Лучший ответ

Исходя из этого ответа, если вы работаете в 64-битной системе и используете 64-битную CLR, то они являются атомарными. Ответ ссылается на эту запись в блоге Эрика Липперта: https://blogs.msdn.microsoft.com/ericlippert/2011/05/31/atomicity-volatility-and-immutability-are-different-part-two/

Спецификация CLI фактически дает более сильные гарантии. CLI гарантирует, что чтение и запись переменных типов значений, которые имеют размер (или меньше) естественного размера указателя процессора, являются атомарными; если вы выполняете код С# в 64-битной операционной системе в 64-битной версии CLR, тогда чтение и запись 64-битных двойных и длинных целых также гарантированно будут атомарными. Язык С# не гарантирует этого, но спецификация времени выполнения дает. (Если вы выполняете код С# в какой-либо среде, которая не реализована какой-либо реализацией CLI, то, конечно, вы не можете полагаться на эту гарантию; обратитесь к поставщику, который продал вам среду выполнения, если вы хотите знать, какие гарантии они предоставляют.)

  • 1
    Обратите внимание, что чтение и запись должны быть выровнены. Процессору разрешается прерывать чтение, если, скажем, вы разыменовываете указатель на четырехбайтовую структуру, имеющую адрес с нечетным номером.
  • 0
    Я предполагаю, что running C# code [..] in a 64 bit version of the CLR исключит 32-битные сборки, работающие внутри 64-битной CLR (через WOW64).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню