2012-11-01 7 views
78

Wie erhält man einen Thread Safe Counter in C# mit bestmöglicher Performance?C# Thread Safe Fast (est) Counter

Dies ist so einfach wie es nur geht:

public static long GetNextValue() 
{ 
    long result; 
    lock (LOCK) 
    { 
     result = COUNTER++; 
    } 
    return result; 
} 

Aber gibt es schnellere Alternativen?

Antwort

20

Ich schlage vor, Sie in Interlock-Zuwachs in der System.Threading Bibliothek gebaut von .NET verwenden.

Der folgende Code wird eine lange Variable durch Verweis zu erhöhen und völlig sicher ist Thread:

Interlocked.Increment(ref myNum); 

Quelle: http://msdn.microsoft.com/en-us/library/dd78zt0c.aspx

66

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.

+0

Upvote zum Hinzufügen von Kontext – fsimonazzi

+0

-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