Ответ 1
HashSet<T>
не является потокобезопасным. Особенно, когда вы добавляете элементы в многопоточный сценарий и внутренняя емкость должна быть увеличена, все может выйти из строя.
У меня есть простое приложение, которое добавляет около 7 миллионов коротких строк в HashSet <string>
. Иногда я получаю исключение во время вызова Hashset.Add(): System.Collections.Generic.HashSet`1.IncreaseCapacity(): индекс находился за пределами массива.
Это прерывистая проблема и, похоже, связана с памятью, но это на сервере win2k8 R2 с 16 ГБ, не намного больше, большая часть этой физической памяти доступна. Любые идеи?
HashSet<T>
не является потокобезопасным. Особенно, когда вы добавляете элементы в многопоточный сценарий и внутренняя емкость должна быть увеличена, все может выйти из строя.
Методы экземпляра на HashSet<T>
не являются потокобезопасными. В частности, когда вы пытаетесь добавить элемент, который заставит набор превышать границы существующего массива в более чем одном потоке за раз, переменные экземпляра, используемые для отслеживания размера набора и последнего индекса в набор может обновляться в обоих потоках. В частности, если последнее значение индекса обновляется вторым потоком (с большим значением) до того, как первый поток завершит копирование целевого массива, он может попытаться получить доступ к элементу локального массива, который не существует, потому что локальный массив было выделено для того, чтобы удерживать только половину числа элементов, выделенных вторым потоком.