Habe ich Recht, wenn ich denke, dass dies die richtige Verwendung eines Concurrent Dictionary ist?
private ConcurrentDictionary<int,long> myDic = new ConcurrentDictionary<int,long>();
//Main thread at program startup
for(int i = 0; i < 4; i++)
{
myDic.Add(i, 0);
}
//Seperate threads use this to update a value
myDic[InputID] = newLongValue;
Ich habe keine Sperren usw. und aktualisiere nur den Wert im Wörterbuch, obwohl möglicherweise mehrere Threads versuchen, dasselbe zu tun.
newLongValue
vom vorherigen Wert von abmyDic[InputID]
?myDic[InputID]
auf die Rennbedingungen zuzugreifen . Sie sollten versuchenGetOrAdd
myDic[InputID]
dass es Probleme gibt, wenn es als Wert verwendet wird.GetOrAdd
ist kein korrekter Ersatz, da er nur hinzugefügt wird, wenn kein Wert vorhanden ist. Wir können stattdessen verwendenAddOrUpdate
, um denselben Wert im Wörterbuch hinzuzufügen / zu aktualisieren.Antworten:
Es hängt davon ab, was Sie unter threadsicher verstehen.
Von MSDN - Gewusst wie: Hinzufügen und Entfernen von Elementen zu einem ConcurrentDictionary :
So ist es möglich, eine inkonsistente Ansicht des Werts eines Elements im Wörterbuch zu erhalten.
quelle
Der beste Weg, dies herauszufinden, ist die Überprüfung der MSDN-Dokumentation.
Für ConcurrentDictionary lautet die Seite http://msdn.microsoft.com/en-us/library/dd287191.aspx
Im Abschnitt Thread-Sicherheit heißt es: "Alle öffentlichen und geschützten Mitglieder von ConcurrentDictionary (Of TKey, TValue) sind threadsicher und können von mehreren Threads gleichzeitig verwendet werden."
Aus Sicht der Parallelität sind Sie also in Ordnung.
quelle
Ja, du hast recht.
Dies und die Möglichkeit, das Wörterbuch in einem Thread aufzulisten, während es in einem anderen Thread geändert wird, sind die einzigen Existenzmittel für diese Klasse.
quelle
ConcurrentDictionary
.Es kommt darauf an, in meinem Fall bevorzuge ich diese Methode.
Einzelheiten zur Methodenverwendung finden Sie in der MSDN-Bibliothek .
Beispielnutzung:
quelle
Nur eine Anmerkung: Rechtfertigt nicht die Verwendung eines ConcurrentDicitonary- Objekts mit einer linearen Schleife, wodurch es nicht ausreichend genutzt wird. Die beste Alternative besteht darin, den Empfehlungen der Microsoft-Dokumentation zu folgen, die von Oded mithilfe von Parallelität gemäß dem folgenden Beispiel erwähnt wurden:
quelle