Concurrent-Wörterbuch in C #

8

Ich muss das gleichzeitige Wörterbuch implementieren, da .Net keine gleichzeitige Implementierung für Sammlungen enthält (da .NET4 enthalten ist). Kann ich dafür "Power Threading Library" von Jeffrey Richter verwenden oder vorhandene Varianten implementieren oder einen Ratschlag implementieren? Danke ...

    
jitm 25.03.2010, 12:04
quelle

4 Antworten

3

Sie können Reflektor verwenden, um den Quellcode der gleichzeitigen Implementierung von .NET 4.0 RC anzuzeigen und zu kopieren es zu Ihrem eigenen Code. Auf diese Weise haben Sie die wenigsten Probleme bei der Migration auf .NET 4.0.

    
Steven 25.03.2010, 12:28
quelle
4

Ich habe einen Thread-sicheren Wrapper für die normale Dictionary-Klasse geschrieben, der Interlocked verwendet, um das interne Wörterbuch zu schützen. Interlocked ist bei weitem der schnellste verfügbare Sperrmechanismus und bietet eine viel bessere Leistung als ReaderWriterLockSlim, Monitor oder eine der anderen verfügbaren Sperren.

Der Code wurde zum Implementieren einer Cache -Klasse verwendet für Fasterflect , eine Bibliothek zur Beschleunigung der Reflektion. Daher haben wir verschiedene Ansätze ausprobiert, um die schnellstmögliche Lösung zu finden. Interessanterweise sind die neuen gleichzeitigen Auflistungen in .NET 4 merklich schneller als meine Implementierung, obwohl beide verglichen mit Lösungen, die einen leistungsschwächeren Mechanismus verwenden, ziemlich schnell sind. Die Implementierung für .NET 3.5 befindet sich in einer bedingten Region in der unteren Hälfte der Datei.

    
Morten Mertner 25.03.2010 13:07
quelle
3

Ich habe selbst ein Concurrent Dictionary geschrieben (vor .NET 4.0% System.Collections.Concurrent namespace); da ist nicht viel dran. Sie möchten im Grunde nur sicherstellen, dass bestimmte Methoden nicht gleichzeitig aufgerufen werden, z. B. Contains und Remove oder etwas ähnliches.

Was ich getan habe, war die Verwendung von ReaderWriterLock (in .NET 3.5 und höher, könnten Sie mit ReaderWriterLockSlim gehen) und AcquireReaderLock für alle "Lese" -Operationen aufrufen (wie this[TKey] , ContainsKey , usw.) und AcquireWriterLock für alle "Schreib" -Operationen (wie this[TKey] = value , Add , Remove usw.). Stellen Sie sicher, dass alle Aufrufe dieser Art in einen Block try / finally eingeschlossen werden, wodurch die Sperre in finally aufgehoben wird.

Es ist auch eine gute Idee, das Verhalten von GetEnumerator geringfügig zu ändern: Anstatt über die vorhandene Auflistung aufzulisten, eine Kopie davon zu erstellen und eine Aufzählung darüber zu erlauben. Andernfalls sehen Sie sich potentiellen Deadlocks gegenüber.

    
Dan Tao 25.03.2010 12:36
quelle
0

Hier ist eine einfache Implementierung, die vernünftiges Sperren verwendet (obwohl Interlocked ) wäre wahrscheinlich schneller): Ссылка

Erstellen Sie im Grunde einfach einen Dictionary-Wrapper / Decorator und synchronisieren Sie den Zugriff auf alle Lese- / Schreibaktionen.

Wenn Sie zu .Net 4.0 wechseln, ersetzen Sie einfach alle Ihre Überladungen durch delegierte Aufrufe an das zugrunde liegende ConcurrentDictionary.

    
Ryan Emerle 25.03.2010 13:10
quelle

Tags und Links