Supongamos que tengo la siguiente clase C#Varios hilos que llaman a los mismos objetos funcionan simultáneamente. ¿Puede causar problemas?
class MyClass
{
private int _i;
private object _locker = new object();
public void DoSomething()
{
var b = 2;
// some work that depends on b being 2
lock(_locker)
{
_i = 3;
}
// some more work
b = -1;
// some more work
}
}
Y utilizo esta manera,
//Usage:
var myobject = new MyClass();
new Thread(new ThreadStart(() => myobject.DoSomething())).Start();
new Thread(new ThreadStart(() => myobject.DoSomething())).Start();
¿Puede la siguiente secuencia pasar?
Thread 1 is halfway through its work.
Thread 2 just starts. Sets b = 2.
Thread 1 sets b = -1.
Thread 2 is confused because it expected b to be 2 but its -1.
Lo importante es que b
es una variable local. ¿Los dos hilos tendrán acceso a la misma instancia de b? Entiendo que para la variable de instancia _i
, esto sucederá. De ahí la construcción lock
para eso. Pero no estoy seguro de si también debo bloquear las variables locales.
'b' es local y, por lo tanto, exclusivo de cada hilo. –
Si a '_i' solo se le asignan los mismos valores dos veces, ¿por qué no considera mover la asignación en un código no simultáneo antes de iniciar los hilos? (o cuando terminen) –