gpt4 book ai didi

c# - Iterating Over ConcurrentDictionary 只读时,ConcurrentDictionary 是否被锁定?

转载 作者:可可西里 更新时间:2023-11-01 08:22:29 28 4
gpt4 key购买 nike

  1. 我在我的网络应用程序中创建了一个 ConcurrrentDictionary 作为应用程序对象。它在 session 之间共享。 (基本上用作存储库。)
  2. 有时,任何可用的 session 都会将新项目添加到字典中。

仅允许管理员查看

现在,我想允许管理员列出字典中的所有值,但管理员不会添加或删除项目,相反我只会提供一种方式让管理员查看通过遍历项目来读取集合中的项目。

(伪)代码看起来像这样:

foreach (var e in EmployeeCache.Instance.AllEmployees)
{
Console.WriteLine(e.Key);
}

我的问题是:

如果我遍历项目,ConcurrentDictionary 在读取时会被锁定吗?换句话说,ConcurrentDictionary 是否已锁定,以便其他 session 无法添加或删除,而管理代码只是简单地遍历 ConcurrentDictionary?

如果没有锁定,你能解释一下吗

如果您认为它没有被锁定,您能否快速总结一下它是如何做到这一点的?例如,它是否为只读操作创建了 ConcurrentDictionary 的副本,然后允许读取迭代运行——了解对真实字典的并发更改不会被看到?

我要确定的内容

我正在尝试了解提供管理员可以经常刷新的 ConcurrentDictionary 查看器的影响。 IE。如果他们经常刷新它会影响网络应用程序的性能。因为 session 正在等待对象解锁以便他们可以添加/删除项目?

最佳答案

这就是ConcurrentDictionary.GetEnumerator已实现:

/// <remarks>
/// The enumerator returned from the dictionary is safe to use concurrently with
/// reads and writes to the dictionary, however it does not represent a moment-in-time
/// snapshot of the dictionary. The contents exposed through the enumerator may contain
/// modifications made to the dictionary after <see cref="GetEnumerator"/> was called.
/// </remarks>
public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
{
Node[] buckets = m_tables.m_buckets;

for (int i = 0; i < buckets.Length; i++)
{
// The Volatile.Read ensures that the load of the fields of 'current'
// doesn't move before the load from buckets[i].
Node current = Volatile.Read<Node>(ref buckets[i]);

while (current != null)
{
yield return new KeyValuePair<TKey, TValue>(current.m_key, current.m_value);
current = current.m_next;
}
}
}

如您所见,迭代是无锁的,并且只生成一个不可变结构 (KeyValuePair),每次迭代都会将其返回给调用者。这就是为什么它不能保证 ConcurrentDictionary

的及时快照

这肯定不会对迭代时添加/更新新值产生性能影响,但它不能保证您的管理员将看到字典的最新快照。

  1. 您可以自己浏览其余的源代码 http://sourceof.net
  2. 你也可以查看Inside the Concurrent Collections:ConcurrentDictionary西蒙·库珀。
  3. Are all of the new concurrent collections lock-free?

关于c# - Iterating Over ConcurrentDictionary 只读时,ConcurrentDictionary 是否被锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24247029/

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