ist das sperren notwendig für die Wörterbuch nachschlagen?
lock(dictionaryX)
{
dictionaryX.TryGetValue(key, out value);
}
ist das sperren notwendig, während Sie Suchvorgänge, um ein Wörterbuch ?
Das Programm ist multithreaded, und beim hinzufügen von Schlüssel/Wert dict. dict ist gesperrt.
- wenn Ihre Frage ernst und betrachtet Multithread-Programme, stellen Sie bitte sicher, dass Sie erwähnen explizit, dass Ihre Frage ein.
- meine Frage war nicht so ernst wie Ihren Kommentar.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verriegelung ist nur dann erforderlich, wenn Sie Zugriff auf eine Ressource synchronisieren von threads. Solange es nicht mehrere threads beteiligt, dann sperren wird hier nicht benötigt.
Im Rahmen der Aktualisierung und Lesen Sie den Wert von mehreren threads, ja, eine Sperre ist absolut notwendig. In der Tat, wenn Sie mit 4.0 sollten Sie erwägen, Umstellung auf eine der Sammlungen speziell für den gleichzeitigen Zugriff.
Dictionary
erfordert eine Sperre, es sei denn, es gibt mehrere threads beteiligtWie bereits erwähnt hier:
UPDATE:
werfen Sie einen Blick auf "Thread Safety" Teil auf dieser Seite zu.
Als mit viele subtile Fragen in der Programmierung, die Antwort lautet: Nicht unbedingt.
Wenn Sie nur das hinzufügen von Werten wie eine Initialisierung, dann die anschließende Lesung nicht synchronisiert werden müssen. Aber auf der anderen Seite, wenn Sie gehen, um Lesen und schreiben zu allen Zeiten, dann absolut Sie müssen zum Schutz dieser Ressource.
Jedoch eine ausgewachsene
lock
vielleicht nicht die beste Art und Weise, je nach der Menge der Zugriffe auf Ihre Wörterbuch bekommt. Versuchen Sie eineReaderWriterLockSlim
wenn Sie mit .NET 3.5 oder höher.ReaderWriterLockSlim
wird langsamer sein als eine einfache altelock
in dieser situation...viel langsamer, in der Tat. In meiner eigenen tests habe ich festgestellt, dassReaderWriterLockSlim
hat etwa 5x die overhead-und die altenReaderWriterLock
ist etwa 15x. Ein RW-lock hat einen viel engeren Anwendungsbereich als eine normalelock
- und als solches wird es langsamer in den meisten Situationen. RW-locks wirklich Leuchten, wenn die Sperre ist für eine lange Dauer und die Anzahl der Autoren überzahl der Leser durch eine große Marge. Es lohnt sich, benchmarking, obwohl.Wenn Sie über mehrere threads den Zugriff auf das Wörterbuch, dann brauchen Sie Sie nicht zu sperren, auf der Aktualisierungen und auf "lookup". Der Grund, warum Sie brauchen, um lock-on-lookup ist, dass es da ein update statt, zur gleichen Zeit, die Sie tun, den lookup und das Wörterbuch konnte in einem inkonsistenten Zustand während der Aktualisierung. Zum Beispiel, stellen Sie sich vor, dass Ihr ein thread zu tun:
und einem separaten thread tun:
Was passieren könnte, ist, dass der thread tut das
TryGetValue
bestimmt, dass das Element in das Wörterbuch, aber bevor Sie es abrufen können, die posten, der andere thread entfernt. Das Ergebnis wäre, dass der thread tut der lookup-würde entweder eine Ausnahme oderTryGetValue
zurückkehren würdetrue
aber dievalue
wärenull
oder möglicherweise ein Objekt, das nicht mit dem Schlüssel übereinstimmen.Ist es nur eine Sache, die passieren kann. Etwas ähnlich verheerend kann passieren, wenn Sie tun eine Suche auf einem thread und einem anderen thread hat ein hinzufügen des Wertes, den Sie versuchen zu suchen.
Verwenden Sie die neue
Z. B. concurrentdictionary<TKey, TValue>
Objekt und Sie können vergessen, zu tun haben sperren.if (concDic.Contains("key"))
concDic["key"].Do();
erhalten Sie eine Ausnahme, denn dieser Schlüssel kann entfernt werden, zwischen der if-und Do().Ja, Sie brauchen, um es zu sperren Wörterbuch für den Zugriff in einer Multithread-Umgebung. Das schreiben in einem Wörterbuch ist nicht atomar, so könnte es fügen Sie den Schlüssel, aber nicht der Wert. In diesem Fall, wenn Sie darauf zugreifen, könnten Sie eine Ausnahme.
Wenn Sie auf .Net 4, können Sie ersetzen Sie mit Z. B. concurrentdictionary dies sicher zu machen. Es gibt andere ähnliche Sammlungen, bevorzugt, wenn Sie brauchen, Multithread-Zugriff, in der System.Sammlung.Concurrent-namespace.
Nicht mit roll-your-own-Verriegelung ist dies eine option für Sie.
Ja, sollten Sie sperren, wenn Sie dieses Wörterbuch ist eine freigegebene Ressource zwischen mehr als einem thread. Dies stellt sicher, dass Sie den richtigen Wert und der andere thread nicht passieren, um den Wert zu ändern in der Mitte, während Sie Ihre Lookup-Aufruf.
Ja, Sie haben, zu sperren, wenn Sie Multithread-updates auf das Wörterbuch. Überprüfen Sie diesen tollen Beitrag für details: "Thread-safe" Dictionary(TKey,TValue)
Aber da Z. B. concurrentdictionary<> eingeführt, können Sie es verwenden, entweder via .NET 4 oder mit Rx 3.5 (enthält System.Threading.dll mit der Umsetzung für den neuen thread-safe collections)