gpt4 book ai didi

c# - 为并发字典公开 GetEnumerator()

转载 作者:太空宇宙 更新时间:2023-11-03 11:09:24 26 4
gpt4 key购买 nike

我正在为 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;
}

最佳答案

您的方法对于并发编写器来说不是线程安全的,因为

  1. 您的枚举器没有拍摄任何快照。它指的是原始字典。对其调用 ToList 或其他内容以进行实际快照。
  2. 并发编写器不使用您的锁,因此它们并发执行。这是不安全的。
  3. 如果锁体很大,不要使用自旋锁。
  4. 如果 TryEnter 失败怎么办?毕竟叫试试

这是一个去掉了所有技巧的固定版本:

IEnumerator IEnumerable.GetEnumerator()
{
lock (internalDictionary) return internalDictionary.ToList();
}

并发写入者也必须获取锁。

关于c# - 为并发字典公开 GetEnumerator(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14634698/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com