Tengo una pregunta relacionada con el modelo de la memoria C# y los hilos. No estoy seguro de si el siguiente código es correcto sin la palabra clave volátil.Modelo de memoria C# y variable no volátil inicializada antes de la creación del otro hilo
public class A {
private int variableA = 0;
public A() {
variableA = 1;
Thread B = new Thread(new ThreadStart(() => printA())).Start();
}
private void printA() {
System.Console.WriteLine(variableA);
}
}
Mi preocupación es si se garantiza que el hilo B verá variableA con valor 1 sin utilizar volátil? En el hilo principal solo estoy asignando 1 a variableA en el constructor. Después de eso, no estoy tocando la variable A, solo se usa en el hilo B, por lo que probablemente no sea necesario el bloqueo.
Pero, ¿está garantizado que el hilo principal va a vaciar su caché y escribir los contenidos de la variable A en la memoria principal, para que el segundo hilo pueda leer el valor recién asignado?
Además, ¿se garantiza que el segundo hilo leerá los contenidos de la variable A de la memoria principal? ¿Pueden producirse algunas optimizaciones del compilador y el subproceso B puede leer los contenidos de la variableA del caché en lugar de la memoria principal? Puede suceder cuando se cambia el orden de las instrucciones.
Por supuesto, agregando volátil a la variable Una declaración hará que el código sea correcto. Pero, ¿es necesario? Lo estoy preguntando porque escribí un código con algunas inicializaciones de variables no volátiles en el constructor, y las variables son utilizadas más tarde por algunos subprocesos del temporizador, y no estoy seguro si es totalmente correcto.
¿Qué pasa con el mismo código en Java?
Gracias, Michal
Sí, sospecho lo mismo, pero quiero estar seguro. Le enviaré un correo electrónico, gracias. –