Словарь C # одновременное добавление или изменение только для разных ключей, необходим ли ConcurrentDictionary?

#c# #.net #dictionary #concurrency #concurrentdictionary

#c# #.net #словарь #параллелизм #concurrentdictionary

Вопрос:

У меня есть словарь, который поддерживает только add modify операции и и может работать одновременно, но всегда для разных ключей. Ключи — это int, а значения — ссылочный тип. Также изменить означает изменить некоторые свойства значения.

Мои вопросы:

  1. Нужно ли мне использовать ConcurrentDictionary в этом сценарии? Если необходимо, как это помогает?
  2. Если одновременное изменение может произойти с одним и тем же ключом, поможет ли ConcurrentDictionary обеспечить безопасность потоков? Насколько я понимаю, нет, это правильно?

Спасибо!

Комментарии:

1. 1. Да, вам нужно его использовать. 2. «Все эти операции являются атомарными и потокобезопасными по отношению ко всем другим операциям в классе ConcurrentDictionary<TKey, TValue> . Единственными исключениями являются методы, которые принимают делегат, то есть AddOrUpdate и GetOrAdd «. Нам все еще нужен тег «пожалуйста, прочитайте документы вслух для меня».

2. Что вы обнаружили, когда просмотрели документацию для каждого из этих типов в отношении того, являются ли эти операции допустимыми? Почему информация, которую вы там нашли, не отвечает на эти вопросы?

3. @EdPlunkett Спасибо. Прочитав документы и другие ответы SO, я думаю, что понял это по первому вопросу. Да, мне нужно использовать параллельную версию. Потому что при одновременном добавлении dict может изменять размер, и это вызовет проблемы. Но по второму вопросу я все еще не очень ясен. Я думаю, даже используйте параллельную версию. Когда я одновременно изменяю свойства в стороне значения, мне все равно нужно заблокировать значение. Это правда? Спасибо!

Ответ №1:

Нужно ли мне использовать ConcurrentDictionary в этом сценарии? Если необходимо, как это помогает?

Да, стандартный словарь будет вести себя некорректно, если несколько потоков одновременно добавляют или удаляют записи. (хотя нескольким потокам безопасно читать из него одновременно, если другие его не изменяют).

Если одновременное изменение может произойти с одним и тем же ключом, поможет ли ConcurrentDictionary обеспечить потокобезопасность? Насколько я понимаю, нет, это правильно?

Если вы спрашиваете: «Будет ли параллельный словарь препятствовать одновременному доступу нескольких потоков к значениям внутри словаря одновременно?», Тогда нет, это не так.

Если вы хотите предотвратить одновременный доступ нескольких потоков к одному и тому же значению, вам нужно будет использовать какой-то контроль параллелизма, например блокировку.

Ответ №2:

Лучший способ выяснить это — проверить документацию MSDN.

Для ConcurrentDictionary страницы http://msdn.microsoft.com/en-us/library/dd287191.aspx

В разделе потокобезопасности указано, что «Все общедоступные и защищенные члены ConcurrentDictionary<TKey, TValue> потокобезопасны и могут использоваться одновременно из нескольких потоков».