He escrito una prueba de lo que creo que debería ser un caso válido para un punto muerto. Parece que una vez que el lock
ha sido adquirido por una instancia de la clase a, esa instancia ya no necesita readquirir el lock
incluso si explícitamente intento llamar a otro método que debería volver a lock
.Se requiere bloqueo y otros intentos de bloqueo no bloquean: ¿los bloqueadores C# son reentrantes?
Aquí es la clase:
internal class Tester
{
private readonly object _sync = new object();
public Tester() { }
public void TestLock()
{
lock (_sync)
{
for (int i = 0; i < 10; i++)
{
Deadlock(i);
}
}
}
private void Deadlock(int i)
{
lock (_sync)
{
Trace.WriteLine(i + " no deadlock!");
}
}
}
Salida:
0 sin punto muerto!
1 ¡no hay punto muerto!
2 ¡sin punto muerto!
3 ¡sin punto muerto!
4 ¡sin punto muerto!
5 ¡sin punto muerto!
6 ¡sin punto muerto!
7 ¡sin punto muerto!
8 ¡sin punto muerto!
9 ¡no hay punto muerto!
Hubiera pensado que esto podría causar un punto muerto ... ¿Alguien puede arrojar algo de luz sobre esto?
Estoy bastante cómodo con el multihilo, pero supongo que nunca me di cuenta de que los bloqueos C# son reentrantes. Gracias por la respuesta ... – Kiril