Словарь (Of TKey, TValue) одновременный доступ: худший сценарий - PullRequest
2 голосов
/ 16 февраля 2012

Итак, у меня есть Dictionary<string, SomeClass>, к которому будут обращаться многочисленные параллельные потоки - некоторые будут писать, большинство будут читать. Нет блокировок, нет синхронизации - рабочий поток не будет проверять - просто читайте или пишите. Единственная гарантия состоит в том, что никакие два потока не будут записывать значение с одинаковым ключом. Вопрос в том, может ли эта структура данных быть повреждена таким образом? Под повреждением я имею в виду неработоспособность даже с одним потоком.

Ответы [ 3 ]

8 голосов
/ 16 февраля 2012

может ли эта структура данных быть повреждена таким образом?

Да, скорее всего, вы получите IndexOutOfRange или подобное исключение.
И даже когда вы ловите и игнорируете исключения,вы не получите больше надежных данных.Возможны как дубликаты, так и пропущенные значения.

Так что просто не делай этого.

6 голосов
/ 16 февраля 2012

Наихудшие сценарии включают в себя:

  • NullReferenceException или IndexOutOfRangeException выброшены из метода Dictionary <,>.

  • Произвольное количество данных потеряно . Если два потока пытаются изменить размер таблицы Dictionary <,> одновременно, они могут растоптать друг друга, испортить и потерять данные.

  • Неправильный ответ возвращается при чтении из словаря <,>.

По сути, Dictionary <,> может делать практически все, что только можно придумать, в рамках ограничений, установленных CLR. Предположительно, вы все равно не нарушите безопасность типов и не испортите кучу, как это было бы на родном языке программирования. Наверное, в любом случае: -)

2 голосов
/ 20 февраля 2012

Если вы обращаетесь к коллекции из нескольких потоков, было бы безопаснее использовать одну из многобезопасных разновидностей в .Net 4, например, ConcurrentDictionary

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...