HashTable параллелизм - PullRequest
       11

HashTable параллелизм

2 голосов
/ 30 января 2012

У меня есть HashTable, доступ к которому осуществляется несколькими потоками. Например, давайте рассмотрим три потока:

Поток A выполняет Hash.Insert ("a", новый объект ());

Поток B делает Hash.Insert ("b", новый объект ());

Поток C делает Hash.Insert ("a", новый объект ());

По некоторым причинам я не могу использовать блокировку для всего хэша

Меня не волнует порядок или какой объект будет в хеше в конце процесса. Единственное, что меня волнует, - это не получить повреждение данных при обновлении одной и той же ячейки из разных потоков.

Какие у меня варианты? или это не проблема, и HashTable самостоятельно обрабатывает и сохраняет данные в такте.

Ответы [ 2 ]

5 голосов
/ 30 января 2012

Вы можете использовать что-то вроде:

ConcurrentDictionary<string, object> Hash = new ConcurrentDictionary<string, object>();

из пространства имен System.Collections.Concurrent.

3 голосов
/ 31 января 2012

ConcurrentDictionary должен работать для вас. Он не блокируется, но не блокирует весь хэш, за исключением определенных ситуаций.

Он использует две коллекции: массив блокировок и коллекцию хэш-блоков.
Количество блоков блокировок можно контролировать, задавая уровень параллелизма, а начальное количество блоков хешей можно контролировать, задавая начальную емкость. (оба являются параметрами конструктора).

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

Единственный раз, когда параллельный словарь блокирует все блоки блокировки:

  1. При изменении размера хэш-блоков.
  2. При чтении публичного свойства ключей.
  3. При чтении общедоступных значений Property.
  4. При чтении общедоступных графов собственности.
  5. При чтении публичного свойства IsEmpty.
  6. При вызове Clear ().
  7. При сериализации.

За исключением изменения размера их легко избежать.

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

...