Ich überprüfe einen Code, der von einem Berater geschrieben wurde, und obwohl bereits Dutzende roter Fahnen aufgetaucht sind, kann ich mich nicht um das folgende Snippet kümmern:
private void foo()
{
if (InvokeRequired)
{
lock (new object())
{
if (m_bar!= null)
Invoke(new fooDelegate(foo), new object[] { });
}
}
else
{
if(OnBazChanged != null)
OnBazChanged();
}
}
Was macht lock (new object ()) hier? Sollte keinerlei Auswirkungen haben, da immer ein anderes Objekt gesperrt wird. Diese Art der Sperre bleibt jedoch im gesamten Code bestehen, auch in nicht kopierten und eingefügten Teilen. Ist dies ein Sonderfall in der C # -Sprache, der zu etwas kompiliert wurde, von dem ich nichts weiß, oder hat der Programmierer einfach einen Frachtkult übernommen, der vor einiger Zeit funktioniert hat?
c#
thread-safety
locking
Charles
quelle
quelle
new object()
in einem Feld gespeichert war, und dieses Feld wurde in denlock()
Anweisungen verwendet, und sie wussten nicht besser, es nicht zu inlineieren.lock
Antworten:
Ich wäre nicht überrascht, wenn jemand dies gesehen hätte:
und dachte, er könnte die Anzahl der Zeilen reduzieren.
Ich wäre sehr besorgt, wenn das der Fall wäre ...
quelle
Hier ist eine ähnliche Frage und Antwort:
quelle
Es ist wahrscheinlich nutzlos. Es besteht jedoch die Möglichkeit, dass eine Speicherbarriere entsteht. Nicht sicher, ob c # die Elision sperrt oder ob die Ordnungssemantik der Sperre beibehalten wird.
quelle