yo estaba tratando de lock
una variable Boolean
cuando me encontré con el siguiente error:¿Por qué no podemos bloquear un tipo de valor?
'bool' no es un tipo de referencia como es requerido por la instrucción lock
Parece que sólo los tipos de referencia son permitido en lock
declaraciones, pero no estoy seguro de entender por qué.
Andreas está indicando en su comment:
Cuando [un tipo de valor] objeto se pasa de un subproceso a la otra, se realiza una copia, de manera que los hilos terminan trabajando en 2 objetos diferentes, que es seguro.
¿Es cierto? ¿Eso significa que cuando hago lo siguiente, de hecho estoy modificando dos x
diferentes en el xToTrue
y el método xToFalse
?
public static class Program {
public static Boolean x = false;
[STAThread]
static void Main(string[] args) {
var t = new Thread(() => xToTrue());
t.Start();
// ...
xToFalse();
}
private static void xToTrue() {
Program.x = true;
}
private static void xToFalse() {
Program.x = false;
}
}
(este código solo es claramente inútil en su estado, que es sólo para el ejemplo)
P.S: lo que sé sobre esta cuestión en How to properly lock a value type. Mi pregunta no está relacionada con el cómo pero al por qué.
Su programa no está pasando x entre los hilos que está utilizando una copia compartida. Sin embargo, aún no es seguro para subprocesos ya que no está accediendo a x en el alcance de un bloqueo y x no se declara volátil. Siento que viene otra pregunta: "¿Por qué x en este ejemplo necesita ser volátil?" –
@MartinBrown: Lo sé, y en mi código * real *, uso un candado en un objeto dedicado (como mencioné en mi pregunta, está relacionado con * por qué * y no con * how *). En cuanto a 'volátil ', es [no es necesario cuando se bloquea correctamente] (http://blogs.msdn.com/b/ericlippert/archive/2011/06/16/atomicity-volatility-and-immutability-are-different- part-three.aspx). – Otiel