he encontrado varias preguntas sobre este mismo tema, pero en relación con las variables generales (tipos de valor y de referencia) La respuesta aceptada de this question dice:¿La asignación de referencia y la lectura de operaciones atómicas?
partición I, sección 12.6.6 de los estados de especificaciones de la CLI: "Un conforme CLI garantizará que el acceso de lectura y escritura a ubicaciones de memoria alineadas correctamente no mayores que el tamaño de la palabra nativa es atómico cuando todos los accesos de escritura a una ubicación son del mismo tamaño ".
Las variables de referencia (es decir, las clases) son punteros, igual al tamaño de la palabra nativa, pero tengo un par de dudas:
aparecen referencias garantiza que sea localizaciones de memoria correctamente alineados?
No entiendo la última parte. ¿Qué significa esto? "... cuando todos los accesos de escritura a una ubicación son del mismo tamaño".
En resumen, ¿se garantiza que obj2 sea válido en cada iteración del ciclo en el siguiente código?
class MyClass
{
private OtherClass m_Object;
void Thread1()
{
while(true)
{
OtherClass obj1 = new OtherClass();
m_Object = obj1;
}
}
void Thread2()
{
while (true)
{
OtherClass obj2 = m_Object;
// Is obj2 guaranteed to be valid?
obj2.Check();
}
}
}
eso es bastante interesante, gracias. ¿Qué sucede si dentro de los bucles, en lugar de la lectura/asignación directa de la variable m_Object, hay llamadas a métodos que realmente hicieron la lectura/asignación? ¿El problema de volatilidad todavía existiría? – raven
@Jaime: Sí, a menos que haya algún tipo de sincronización forzada - campo volátil, barrera de memoria, bloqueo, etc llamar 'Interlocked' - entonces aún puede ocurrir. (En mi experiencia, este tipo de cosas no muerde muy a menudo, pero * sí * ocasionalmente, así que es mejor evitarlo por completo). – LukeH