2012-03-30 16 views
2

Ich verstehe, dass C# -Wörterbücher nicht Thread-sicher sind, wenn es darum geht, Elemente hinzuzufügen, zu lesen und zu entfernen; Können Sie jedoch auf die Thread-Eigenschaft eines C# -Verzeichnisses threadsicher zugreifen, wenn ein anderer Thread das Wörterbuch schreibt, liest und aus dem Wörterbuch entfernt?Multi-Thread-Zugriff auf C# -Wörterbuch

+2

Erwarten Sie, dass der richtige Wert zurückgegeben wird? –

+0

Oder verwenden Sie einfach ein ConcurrentDictionary ... http://msdn.microsoft.com/en-us/library/dd287191.aspx –

Antwort

0

Sie könnten das Wörterbuch als statisches readonly-Objekt erstellen, und lock es bei der Änderung ... das sollte mit den meisten Problemen umgehen, würde ich denken.

2

Da Eigenschaft ist ein Methodenaufruf unter der Dunstabzugshaube so wirklich Situation ist nicht so einfach wie auf den ersten Blick.

  • T1: Zugreifen Count Eigenschaft
  • T1: get_Count() Aufruf (eine Art von JMP/GOTO ASM-Befehl)
  • T1: Lesen Variable, die eine Anzahl von Elementen darstellt == 1
  • T2 : addign ein neues Element, Realzahl wird 2
  • T1: Erträge 1 aber eigentlich gibt es bereits zwei Artikel

Also, wenn eine Anwendungslogik setzt auf eine Count Eigenschaftswert - theoretisch könnten Sie mit race condition enden.

+0

Da die Eigenschaft nicht direkt geschrieben werden kann, ist es überhaupt nicht in Ordnung, davon gleichzeitig zu lesen. Letzteres folgt nicht dem ersteren. Das ist gefährliches Denken. – usr

+0

richtig Ich war gerade dabei, meine Antwort zu schreiben, anfangs dachte ich falsch, du hast Recht – sll

4

Es sollte threadsicher darin sein, dass es nicht explodiert, aber ich bin ziemlich sicher, es ist nicht threadsicher darin, dass es Ihnen möglicherweise nicht die korrekte Zählung gibt, weil andere Threads das Wörterbuch manipulieren.

[Edit: wie Usr darauf hinweist, nur weil es derzeit threadsafe auf dieser Ebene ist, bedeutet nicht, dass es so weiter sein wird. Sie haben keine Garantien]

0

Je nachdem, was Sie erreichen möchten, können Sie das Wörterbuch mit einer ReaderWriterLockSlim schützen. Auf diese Weise können Sie schnellere Lesevorgänge ausführen und das Wörterbuch nur sperren, wenn Sie Mutationsoperationen ausführen.

0

Anstatt davon aus, ging ich und sah in Reflektor es:

public int Count 
{ 
    get 
    { 
     // count and freeCount are local fields 
     return (this.count - this.freeCount); 
    } 
} 

Also ja, es „Thread-sicher“, dass es den Zugriff verursacht Korruption nicht im Wörterbuch Objekt. Das heißt, ich bin mir nicht sicher, ob ich an einen Anwendungsfall denken kann, bei dem es wichtig ist, die Zählung mit Genauigkeit zu erhalten, wenn auf das Wörterbuch von einem anderen Thread zugegriffen wird.

+0

'if (dict.Count == 1)' würde nie * sicher * arbeiten –

+0

@L.B hast du den Absatz am Ende meiner Antwort gelesen? –

+0

Denkst du, ich schreibe einfach Kommentare, ohne die ganze Antwort zu lesen? "Ich kann mir einen Anwendungsfall vorstellen, bei dem es wichtig ist, die Zählung mit einiger Genauigkeit durchzuführen, wenn das Wörterbuch von einem anderen Thread aufgerufen wird." Korrekt, aber begrenzt mit Ihrer Vorstellungskraft. –

1

Erstens: Dies ist ein gefährliches Denken. Sei sehr vorsichtig, wenn du so etwas in Produktion bringst. Wahrscheinlich sollten Sie nur eine Sperre oder ConcurrentDictionary verwenden.

Sind Sie mit einer ungefähren Antwort zufrieden?

Aber: Reflektor zeigt, dass count nur ein Feld liest und es zurückgibt. Dies wird sich wahrscheinlich nicht für immer ändern. Sie könnten also in diesem Fall vernünftigerweise das Risiko eingehen.