Правильное использование словаря - PullRequest
72 голосов
/ 22 ноября 2011

Прав ли я, полагая, что это правильное использование словаря одновременного использования

private ConcurrentDictionary<int,long> myDic = new ConcurrentDictionary<int,long>();

//Main thread at program startup

for(int i = 0; i < 4; i++)
{
  myDic.Add(i, 0);
}

//Seperate threads use this to update a value

myDic[InputID] = newLongValue;

У меня нет блокировок и т. Д., И я просто обновляю значение в словаре, даже если несколько потоков пытаются выполнитьто же самое.

Ответы [ 5 ]

66 голосов
/ 22 ноября 2011

Это зависит от того, что вы подразумеваете под поточно-ориентированным.

От MSDN - Как: добавлять и удалять элементы из ConcurrentDictionary :

ConcurrentDictionary<TKey, TValue> предназначен для многопоточных сценариев.Вам не нужно использовать блокировки в своем коде для добавления или удаления элементов из коллекции.Однако один поток всегда может извлечь значение, а другой поток - немедленно обновить коллекцию, дав этому же ключу новое значение.

Таким образом, возможно получить несогласованное просмотр значения элемента в словаре.

4 голосов
/ 22 ноября 2011

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

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

В разделе безопасности потоков указано "Все открытые и защищенные члены ConcurrentDictionary (Of TKey, TValue) являются потокобезопасными и могут использоваться одновременно из нескольких потоков."

Так что с точки зрения параллелизма у вас все в порядке.

2 голосов
/ 22 ноября 2011

Да, вы правы.

Это и возможность перечислить словарь в одном потоке при его изменении в другом потоке - единственные средства существования для этого класса.

1 голос
/ 30 ноября 2015

Зависит от того, что в моем случае я предпочитаю использовать этот метод.

ConcurrentDictionary<TKey, TValue>.AddOrUpdate Method (TKey, Func<TKey, TValue>, Func<TKey, TValue, TValue>);

Подробнее об использовании метода см. MSDN .

Пример использования:

results.AddOrUpdate(
  Id,
  id => new DbResult() {
     Id = id,
     Value = row.Value,
     Rank = 1
  },
  (id, v) =>
  {
     v.Rank++;
     return v;
  });
0 голосов
/ 24 мая 2019

Просто примечание: не оправдывает использование ConcurrentDicitonary объекта с линейным циклом, что делает его недоиспользуемым. Лучшая альтернатива - следовать рекомендациям документации Microsoft, как указано Одед с использованием параллелизма, в соответствии с приведенным ниже примером:

Parallel.For(0, 4, i => 
{
   myDic.TryAdd(i, 0);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...