2012-06-07 2 views
5

Nach der Sprachspezifikation lock(obj) statement; würde kompiliert werden:Was ist der Vorteil von Monitor.Enter (Objekt, ref bool) über Monitor.Enter (Objekt)?

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); 
} 

jedoch als kompiliert wird:

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

Das viel komplizierter als nötig zu sein scheint. Die Frage ist also, was ist der Vorteil dieser Implementierung?

Antwort

5

Wie immer hat Eric Lippert dies bereits beantwortet:

Fabulous Adventures In Coding: Locks and exceptions do not mix

+0

Ich war im Begriff, mich selbst zu beantworten, nachdem ich über eine andere Antwort nachgedacht hatte, die leider gelöscht wurde, bevor ich sie kommentieren konnte. Ich dachte mir mehr darüber nach, wann Exceptions ausgelöst werden könnten, Threads irgendwo unterbrochen werden usw. Es war offensichtlich, dass 'Monitor.Enter' erfolgreich zurückgeliefert werden konnte, aber bevor der Thread in den' try'-Block ging, konnte er unterbrochen werden. Manchmal ist diese Seite zu schnell, um alle Leute zu ehren, die geholfen haben, die Antwort zu finden. – Wormbo

2

Kürzlich I "CLR via C#" zu lesen, dass es nicht wirklich ein Vorteil sein könnte. Der Grund dafür ist, dass der finally-Block die gesperrte Ressource immer freigibt, selbst wenn der try-Block aufgrund eines unerwarteten Fehlers beendet wurde. Das könnte die Ressource in einem undefinierten Zustand und zugänglich machen. Das Programm wird nicht blockieren, aber der Fehler kann viel subtiler und daher schwieriger zu finden sein.

Es hängt sicherlich von der Situation ab, aber ich denke, die aktuelle Implementierung von lock macht am meisten Sinn, wenn Ihre Priorität ist, Deadlocks aufgrund unerwarteter Unterbrechung von Threads an der schlechtesten Stelle zu verhindern.

Verwandte Themen