2012-06-07 9 views
5

Secondo le specifiche del linguaggio lock(obj) statement; sarà compilato come:Qual è il vantaggio di Monitor.Enter (oggetto, ref bool) su Monitor.Enter (oggetto)?

object lockObj = obj; // (the langspec doesn't mention this var, but it wouldn't be safe without it) 
Monitor.Enter(lockObj); 
try 
{ 
    statement; 
} 
finally 
{ 
    Monitor.Exit(lockObj); 
} 

Tuttavia, è compilato come:

try 
{ 
    object lockObj = obj; 
    bool lockTaken = false; 
    Monitor.Enter(lockObj, ref lockTaken); 
    statement; 
} 
finally 
{ 
    if (lockTaken) Monitor.Exit(lockObj); 
} 

che sembra essere molto più complicato di quanto necessario. Quindi la domanda è: qual è il vantaggio di tale implementazione?

risposta

5

Come sempre, Eric Lippert ha già risposto a questa:

Fabulous Adventures In Coding: Locks and exceptions do not mix

+0

Stavo per rispondere a me stesso dopo aver pensato a un'altra risposta che è stata purtroppo cancellata prima che potessi commentare. Mi ha fatto riflettere su quando le eccezioni potevano essere lanciate, i thread interrotti possibilmente ovunque, ecc. Era abbastanza ovvio che "Monitor.Enter" poteva tornare con successo, ma prima che il thread entrasse nel blocco try, poteva essere interrotto. A volte questo sito è troppo veloce per onorare tutte le persone che hanno contribuito a trovare la risposta. – Wormbo

2

Ho letto recentemente in "CLR via C#" che non potrebbe in realtà essere un vantaggio. Il ragionamento è che il blocco finally rilascia sempre la risorsa bloccata, anche se il blocco try è terminato in seguito a un errore imprevisto. Ciò potrebbe lasciare la risorsa in uno stato indefinito e accessibile. Il programma non si bloccherà, ma l'errore potrebbe essere molto più sottile e quindi più difficile da trovare.

Dipende sicuramente dalla situazione, ma credo che l'attuale implementazione di lock ha più senso se la priorità è quello di prevenire situazioni di stallo a causa della inaspettata interruzione delle discussioni nel punto peggiore possibile.

Problemi correlati