Я знаю, что модель памяти .NET (на .NET Framework, а не compact/micro/silverlight/mono/xna/what-have-you) гарантировала, что для определенных типов (в первую очередь примитивных целых и ссылок) операции были гарантированы быть атомарным.Модель памяти .NET, изменчивые переменные и тестовый набор: что гарантировано?
Кроме того, я считаю, что инструкция по тестированию и установке x86/x64 (и Interlocked.CompareExchange
) фактически ссылается на глобальную ячейку памяти, поэтому, если ей удастся, другой Interlocked.CompareExchange
увидит новое значение.
Наконец, я считаю, что volatile
ключевым словом является инструкцией к компилятору распространять читает & пишет как можно скорее и не изменять порядок операций в отношении этого переменного (правильно?).
Это приводит к нескольким вопросам:
- ли мои убеждения выше правильно?
Interlocked.Read
не имеет перегрузки для int, только для длин (которые являются 2 WORD и, следовательно, обычно не читаются атомарно). Я всегда предполагал, что модель памяти .NET гарантирует, что самое новое значение будет видно при чтении int/ссылок, однако с кэшами процессора, регистрами и т. Д. Я начинаю видеть, что это может быть невозможно. Итак, есть ли способ заставить переменную повторно отобразиться?- Является ли летучесть достаточным для решения вышеуказанной проблемы для целых чисел и ссылок?
- На x86/x64 можно предположить, что ...
Если есть две глобальные целочисленные переменные х и у, как инициализируется 0, что если я пишу:
x = 1;
y = 2;
Что NO нить будет видеть x = 0 и y = 2 (т. е. записи будут происходить по порядку). Изменяется ли это, если они нестабильны?
Проблема со ссылкой на «C Keyword Myths Dispelled» в чем-то об .NET заключается в том, что основным источником мифов о «volatile» являются люди, действующие так, как если бы они были одинаковыми в C, C# и Java. В C# 'volatile' действительно есть семантика упорядочения по http://msdn.microsoft.com/en-us/library/aa645755%28v=VS.71%29.aspx. –
"нить на самом деле может видеть x = 0 и y = 2" - поскольку операции записи .NET 2.0 не могут быть переупорядочены. – Vlad