Sé que el modelo de memoria .NET (en .NET Framework; no compacto/micro/silverlight/mono/xna/what-have-you) garantiza que para ciertos tipos (más notablemente primitivos enteros y referencias) se garantizaron las operaciones ser atómico. Modelo de memoria .NET, variables volátiles y prueba y conjunto: ¿qué se garantiza?
Además, creo que las instrucciones de prueba y configuración x86/x64 (y Interlocked.CompareExchange
) hacen referencia en realidad a la ubicación de memoria global, por lo que si tiene éxito, otra Interlocked.CompareExchange
vería el nuevo valor.
Por último, creo que la palabra clave volatile
es una instrucción para el compilador para propagar lee & escribe lo antes posible y para no cambiar el orden de las operaciones relativas a esta variable (¿verdad?).
Esto conduce a una serie de preguntas:
- Son mis creencias anteriores correcta?
Interlocked.Read
no tiene una sobrecarga para int, solo para long (que son 2 WORD y por lo tanto normalmente no se leen atómicamente). Siempre asumí que el modelo de memoria .NET garantizaba que se vería el valor más nuevo al leer ints/references, sin embargo con cachés de procesador, registros, etc. Estoy empezando a ver que esto puede no ser posible. Entonces, ¿hay alguna manera de obligar a la variable a ser recuperada?- ¿Es volátil suficiente para resolver el problema anterior para enteros y referencias?
- en x86/x64 puedo suponer que ...
Si hay dos variables globales enteros x e y, a la vez inicializado a 0 que si escribo:
x = 1;
y = 2;
que ningún hilo verá x = 0 y y = 2 (es decir, las escrituras se realizarán en orden). ¿Esto cambia si son volátiles?
El problema con vincular a "C Keyword Mths Dispelled" en algo sobre .NET es que una fuente importante de mitos sobre 'volátil' es que las personas actúan como si fuera lo mismo en C, C# y Java. En C# 'volátil' de hecho tiene un poco de semántica ordenando según http://msdn.microsoft.com/en-us/library/aa645755%28v=VS.71%29.aspx. –
"el hilo de hecho podría ver x = 0 y y = 2" - ya que las operaciones de escritura de .NET 2.0 no se pueden reordenar. – Vlad