gpt4 book ai didi

c# - 并发字典多次写入

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

我想知道,C# ConcurrentDictionary 是否支持多个同时写入?还是所有写入都序列化?我知道它针对阅读进行了优化,但写作呢?我可以期待多个线程不断写入字典的良好性能吗?

最佳答案

与普通字典一样,写入被“存储”到组中,然后这些存储桶被分组到锁定组中。锁定组的数量被称为字典的“并发级别”。默认情况下,并发级别等于 Environment.ProcessorCount 结果的 4 倍,但是您可以使用 several 覆盖它of its constructors .

为了确定两次写入是否会命中同一个锁,它使用私有(private)方法 GetBucketAndLockNo 来确定要使用哪个哈希桶和哪个锁。

//Code generated via ILSpy from .NET 4.0
private void GetBucketAndLockNo(int hashcode, out int bucketNo, out int lockNo, int bucketCount, int lockCount)
{
bucketNo = (hashcode & 0x7FFFFFFF) % bucketCount;
lockNo = bucketNo % lockCount;
}

所以回答你最初的问题“我可以期待多个线程不断写入字典的良好性能吗?”答案实际上取决于散列的分布情况,以及您是否会不断插入将落入同一锁分组的记录。如果不使用真实世界的数据对其进行测试并查看其性能是否足够,就无法找出答案。

另请注意,there where performance improvements made to ConcurrentDictionary在 .NET 4.5 中,因此如果您使用的是 .NET 4.0 vs 4.5 可能会改变您的结果。例如,如果您没有在构造函数中指定要使用的锁的数量,它将随着字典的增长动态添加更多的锁。

关于c# - 并发字典多次写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19085225/

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