IndexOutOfRangeException при добавлении в Hashset <T>

У меня есть простое приложение, которое добавляет около 7 миллионов коротких строк в HashSet <string>. Иногда я получаю исключение во время вызова Hashset.Add(): System.Collections.Generic.HashSet`1.IncreaseCapacity(): индекс находился за пределами массива.

Это прерывистая проблема и, похоже, связана с памятью, но это на сервере win2k8 R2 с 16 ГБ, не намного больше, большая часть этой физической памяти доступна. Любые идеи?

Ответы

Ответ 1

HashSet<T> не является потокобезопасным. Особенно, когда вы добавляете элементы в многопоточный сценарий и внутренняя емкость должна быть увеличена, все может выйти из строя.

Ответ 2

Методы экземпляра на HashSet<T> не являются потокобезопасными. В частности, когда вы пытаетесь добавить элемент, который заставит набор превышать границы существующего массива в более чем одном потоке за раз, переменные экземпляра, используемые для отслеживания размера набора и последнего индекса в набор может обновляться в обоих потоках. В частности, если последнее значение индекса обновляется вторым потоком (с большим значением) до того, как первый поток завершит копирование целевого массива, он может попытаться получить доступ к элементу локального массива, который не существует, потому что локальный массив было выделено для того, чтобы удерживать только половину числа элементов, выделенных вторым потоком.