2012-12-03 10 views
7

Szukam słownika do odczytu dostępnego z wielu wątków. Podczas gdy ConcurrentDictionary udostępnia takie możliwości, nie chcę mieć narzutów i dziwnego API.Dlaczego ReadOnlyDictionary nie jest wątkowany?

.Net 4.5 podczas dostarczania takiej klasy, dokumentacja stwierdza, że ​​tylko statyczne połączenia są bezpieczne.

Zastanawiam się, dlaczego?

+0

skopiować z dokumentu Microsoft: Bezpieczeństwo wątków Wszystkie publiczne i chronione członkowie ConcurrentDictionary są wątku bezpieczny i może być stosowany jednocześnie z wielu wątków. –

+3

@KenCheung: Nie jest jasne, dlaczego Twój komentarz jest trafny. Pytanie wskazuje, że OP jest już świadomy 'ConcurrentDictionary <,>', ale pyta o bezpieczeństwo 'ReadOnlyDictionary <,>'. –

Odpowiedz

8

ReadOnlyDictionary to tylko opakowanie do dowolnego innego słownika. Jako taki, jest tylko tak bezpieczny dla wątków jak słownik bazowy.

W szczególności, jeśli istnieje wątek modyfikujący podstawowy słownik, podczas gdy inny wątek czyta z opakowania, nie ma gwarancji bezpieczeństwa.

Jeśli chcesz ReadOnlyDictionary który skutecznie niezmienna od wszystkie kątami, można utworzyć klon oryginalnego słownika utwórz ReadOnlyDictionary owijkę wokół tego, a potem nie przechowują odniesienia do klonu wszędzie. W przypadku operacji odczytywania , powinno to być bezpieczne dla wątków. Oczywiście, jeśli klucz lub typy wartości są zmienne, to powoduje to niepokój o drugi stopień "braku bezpieczeństwa".

+0

Też tak pomyślałem. Dzięki. – Mouk

+3

Po prostu wyjaśnienie. Tylko do odczytu nie oznacza, że ​​wątki są bezpieczne. Co się stanie, jeśli słownik przestawi pozycje na podstawie użycia odczytu? Słowniki BCL tego nie robią (AFAIK), ale czytam gdzieś, że Scripting.Dictionary przenosi ostatni element do odczytu na pierwsze miejsce w wiadrze. – adrianm

+1

@adrianm: Tak, to prawda. Ale możesz zawinąć 'System.Collections.Generic.Dictionary' który nigdy nie był modyfikowany i * to * byłoby w porządku. –

Powiązane problemy