Ho scritto un test su ciò che penso dovrebbe essere un caso valido per un deadlock. Sembra che una volta che lo lock
sia stato acquisito da un'istanza della classe a, tale istanza non debba più riacquisire lo lock
anche se provo esplicitamente a chiamare un altro metodo che dovrebbe essere lock
di nuovo.Blocco bloccato e ulteriori tentativi di blocco non bloccare: i blocchi C# sono rientrati?
Qui è la classe:
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!");
}
}
}
uscita:
0 no stallo!
1 nessun deadlock!
2 nessun deadlock!
3 nessun deadlock!
4 nessun deadlock!
5 nessun deadlock!
6 nessun deadlock!
7 nessun deadlock!
8 nessun deadlock!
9 nessun deadlock!
Avrei pensato che questo avrebbe causato un punto morto ... qualcuno può far luce su questo?
Sono abbastanza a mio agio con il multithreading, ma suppongo che non mi sono mai reso conto che le serrature C# sono rientranti. Grazie per la risposta ... – Kiril