Thread sicher Inkrement in C #

9

Ich versuche, ein Element in einer Liste in C # zu erhöhen, aber ich brauche es threadsicher, so dass die Anzahl nicht beeinflusst wird.

Ich weiß, dass Sie das für Ganzzahlen tun können:

Interlocked.Increment(ref sdmpobjectlist1Count);

Aber das funktioniert nicht auf einer Liste, die ich bisher so habe:

%Vor%

Ich weiß, dass das funktioniert, aber ich bin nicht sicher, ob es einen anderen Weg gibt, dies zu tun?

    
jg943 08.04.2013, 20:21
quelle

3 Antworten

1

Wie David Heffernan sagte, sollte ConcurrentDictionary eine bessere Leistung bieten. Der Leistungsgewinn kann jedoch vernachlässigbar sein, je nachdem, wie oft mehrere Threads versuchen, auf den Cache zuzugreifen.

%Vor%     
Faisal Mansoor 08.04.2013, 21:56
quelle
1

Wenn Sie List<int[]> anstelle von List<int> verwenden und jedes Element in der Liste ein Array aus einem einzelnen Element ist, können Sie Increment(ref List[whatever][0]) ausführen und es als atomar definieren. Man könnte die Speichereffizienz leicht verbessern, wenn man

definiert %Vor%

und verwendete dann List<ExposedFieldHolder<int>> und verwendete die Anweisung Increment(ref List[whatever].Value) , um das Inkrement auszuführen. Die Dinge könnten effizienter sein, wenn die eingebauten Typen eine Möglichkeit bieten, ein Objekt als ref oder erlaubte abgeleitete Klassen verfügbar zu machen, um ausreichend Zugang zu ihren Interna zu haben, um diese Fähigkeit selbst zu bieten. Sie müssen dies jedoch nicht tun, also muss man entweder seine eigenen Sammlungstypen von Grund auf neu definieren oder jedes Element in ein eigenes Klassenobjekt kapseln [unter Verwendung eines Arrays oder einer Wrapperklasse].

    
supercat 08.04.2013 22:10
quelle
-1

Überprüfen Sie die Variable, die Sie für "padLock" gesperrt haben, normalerweise können Sie sie als private static Object padLock = new Object() definieren. Wenn Sie es nicht als statisch definieren, hat jedes Objekt eine eigene Kopie, daher wird es nicht funktionieren.

    
Russel Yang 08.04.2013 20:34
quelle