Wie von anderen empfohlen, die Interlocked.Increment
wird eine bessere Leistung als lock()
haben. Sehen Sie sich die IL und die Assembly an, wo Sie sehen werden, dass Increment
sich in eine "Bus Lock" -Anweisung verwandelt und ihre Variable wird direkt erhöht (x86) oder "hinzugefügt" (x64).
Diese Anweisung "Bus Lock" sperrt den Bus, um zu verhindern, dass eine andere CPU auf den Bus zugreift, während die aufrufende CPU ihre Operation ausführt. Sehen Sie sich nun die IL-Anweisung der C# lock()
an. Hier sehen Sie Anrufe an Monitor
, um einen Abschnitt zu beginnen oder zu beenden.
Mit anderen Worten, .Net lock()
Anweisung macht viel mehr als die. Net Interlocked.Increment
.
SO, wenn alles, was Sie tun möchten, ist eine Variable zu erhöhen, wird Interlock.Increment
schneller sein. Überprüfen Sie alle Interlocked-Methoden, um die verschiedenen verfügbaren atomaren Operationen anzuzeigen und diejenigen zu finden, die Ihren Anforderungen entsprechen. Verwenden Sie lock()
, wenn Sie komplexere Dinge wie mehrere zusammenhängende Inkremente/Dekremente ausführen oder den Zugriff auf Ressourcen serialisieren möchten, die komplexer als Ganzzahlen sind.
Upvote zum Hinzufügen von Kontext – fsimonazzi
-1 für Details zur Implementierung. Es ist wahr, dass Sperren viel langsamer ist als eine atomare Operation, aber das hat nichts mit der IL zu tun. Diese Funktionsaufrufe wären viel schneller als eine atomare Operation, wenn nicht ihre Semantik, die nicht von Natur aus für die IL erforderlich ist. – Puppy