2016-10-11 1 views
1

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

Мои вопросы:

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

Спасибо!

+0

1. Да, вам необходимо использовать его. 2. [«Все эти операции являются атомарными и являются потокобезопасными по отношению ко всем другим операциям в классе ConcurrentDictionary . Единственными исключениями являются методы, которые принимают делегат, то есть AddOrUpdate и GetOrAdd."] (https://msdn.microsoft.com/en-us/library/dd287191(v=vs.110).aspx#Anchor_7) Нам по-прежнему нужен тег «please read the docs aloud to me». –

+1

Что вы нашли, когда просмотрели документацию по каждому из этих типов в отношении того, действительно ли эти операции действительны? Как информация, которую вы находите, не отвечает на эти вопросы? – Servy

+0

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

ответ

0

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

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

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

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

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

0

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

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

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

Смежные вопросы