When using a HashSet<string>
to check, whether an item was handled before (i.e. only Add
and Contains
is used). Furthermore it is not relevant, when Contains returns false, even though it was added before ...
I encountered following exception without locking:
[IndexOutOfRangeException: Index was outside the bounds of the array.] System.Collections.Generic.HashSet`1.AddIfNotPresent(T value) +6108128
Is it sufficient, to lock only the Add call?
Following seems to work forever - but that is not a proof...
HashSet<string> hashSet = new HashSet<string>();
Parallel.ForEach(GetString(), h =>
{
hashSet.Contains(h);
lock(hashSetLock)
{
hashSet.Add(h);
}
hashSet.Contains(h);
});
To make it precise: I know that it is not thread-safe to call Contains
without a lock. My question is (accepting false positives) if the above code could throw an exception or could destroy the internal state of the underlying data structure (=HashSet).