私はC#の並行辞書の実装に取り組んでいますが、このGetEnumerator()
実装が実際に(スレッド)セーフであるかどうか疑問に思っています。
実際のスナップショットを実行していないので、後で内部ディクショナリへの読み取り/書き込みを台無しにするのか、それとも公開された列挙IEnumerator
が実際にロック内で実行されるために潜在的なデッドロックを公開するのか疑問に思います。
private readonly Dictionary<TKey, TValue> internalDictionary;
private SpinLock spinLock = new SpinLock();
IEnumerator IEnumerable.GetEnumerator()
{
IEnumerator enumerator;
bool lockTaken = false;
try
{
spinLock.TryEnter(ref lockTaken);
enumerator = (this.internalDictionary as IEnumerable).GetEnumerator();
}
finally
{
if (lockTaken)
{
spinLock.Exit(false);
}
}
return enumerator;
}