Я знаю что модель памяти.NET (на Платформе.NET; не compact/micro/silverlight/mono/xna/what-have-you), гарантировал, что для определенных типов (прежде всего примитивные целые числа и ссылки) операции, как гарантировали, будут атомарными.
Далее, я полагаю что x86/x64 инструкция теста-и-набора (и Interlocked.CompareExchange
) на самом деле ссылается на местоположение глобальной памяти, поэтому если оно следует за другим Interlocked.CompareExchange
видел бы новое значение.
Наконец, я полагаю что volatile
ключевое слово является инструкцией к компилятору, чтобы распространить чтения и записи как можно скорее и не переупорядочить операции относительно этой переменной (право?).
Это приводит к нескольким вопросам:
Interlocked.Read
не имеет перегрузки для интервала, только для longs (которые являются 2 СЛОВАМИ и таким образом обычно не читаются атомарно). Я всегда предполагал, что модель памяти.NET гарантировала, что новейшее значение будет замечено при чтении ints/references, однако с кэшами процессора, регистрами, и т.д. Я начинаю видеть, что это не может быть возможно. Так есть ли способ вынудить переменную быть повторно выбранной?Если существует два глобальных X и Y целочисленных переменных, оба инициализированные к 0 это, если я пишу:
x = 1;
y = 2;
То, что НИКАКОЙ поток не будет видеть x = 0 и y = 2 (т.е. записи произойдут в порядке). Это изменяется, если они энергозависимы?
Я тоже достаточно новичок в Clojure и наслаждаться этим на математических проблемах, где скорость не является проблемой. Это просто так выразительно. Также очень приятно быть в состоянии использовать расширенную точность BigDecimals и Bigintegers прозрачно - не тестируют с неуклюжими конструкторами и методами, которые требует Java.
Предостережение о скорости действительно из-за моего собственного неопытности. Я не знаю, что это проблема для действительно квалифицированного. Это также область, которая поддается распараллелизу, которая, кажется, так просто в Clojure.
-121--2459753- Interlocked.compareexchange
увидит обновленное значение. x = 0
и y = 2
, а использование летучего ключевого слова не изменяется, потому что CPU бесплатный для повторных заказов. Вам нужен барьер памяти. Сводка:
Можно установить таймер при нажатии или отпускании клавиши и игнорировать события KeyPress и KeyRelease, происходящие в пределах интервала повторения.
-121--1663356-Я думаю, что вам нужно создать маркер с именем пользователя и зашифрованной последовательностью аутентификации, которую вы получите из windows Identity. Не нужно хранить пароль в файле cookie. У нас есть приложение, в котором хранятся имя пользователя и аутентифицированная последовательность
-121--978559-Нет, изменчивое ключевое слово и гарантия атомарности слишком слабы. Для этого нужен барьер памяти. Его можно получить явным образом с помощью метода Thread.MemureBarrier ().
Обнаружил этот старый поток. Все ответы Ханса и wj32 верны, за исключением части, касающейся volatile
.
Конкретно по поводу вашего вопроса
Могу ли я предположить, что на x86 / x64 ... Если есть две глобальные целочисленные переменные x и y, оба инициализируются значением 0, если Я пишу:
х = 1; y = 2;
Этот НЕТ поток не увидит x = 0 и y = 2 (т.е. запись будет происходят по порядку).Изменится ли это, если они изменчивы?
Если y
является изменчивым, запись в x
гарантированно произойдет до записи в y
, поэтому ни один поток никогда не увидит x = 0
и y = 2
. Это связано с тем, что запись в изменчивую переменную имеет «семантику выпуска» (логически эквивалентную выбросу ограничения выпуска), то есть все инструкции чтения / записи до того, как она перестанет перемещаться, передают ее. (Это означает, что если x является изменчивым, а y - нет, вы все равно можете увидеть неожиданные x = 0
и y = 2
.) См. Описание и пример кода в ] Спецификация C # для получения более подробной информации.