Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 并发字典多次写入_C#_Dictionary_Concurrency - Fatal编程技术网

C# 并发字典多次写入

C# 并发字典多次写入,c#,dictionary,concurrency,C#,Dictionary,Concurrency,我想知道,C#ConcurrentDictionary是否支持多个同时写入?还是所有写入都序列化?我知道它是为阅读而优化的,但是写呢?如果多个线程不断地向字典写入数据,我是否能够获得良好的性能?与普通字典一样,写入数据被“扣”到组中,然后这些存储桶被分组到锁定组中。锁定组的数量称为字典的“并发级别”。默认情况下,并发级别等于的结果的4倍,但是您可以使用覆盖它 为了确定这两次写入是否会命中同一个锁,它使用私有方法GetBucketAndLockNo来确定要使用哪个哈希桶和哪个锁 //Code ge

我想知道,C#ConcurrentDictionary是否支持多个同时写入?还是所有写入都序列化?我知道它是为阅读而优化的,但是写呢?如果多个线程不断地向字典写入数据,我是否能够获得良好的性能?

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

为了确定这两次写入是否会命中同一个锁,它使用私有方法
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;
}
因此,要回答您最初的问题“多线程不断向字典写入数据时,我能期望良好的性能吗?”答案实际上取决于散列的分布情况,以及您是否会不断插入属于同一锁组的记录。如果不使用真实世界的数据进行测试并查看其性能是否足够,就无法找到答案


还要注意的是,在.NET4.5中,如果使用.NET4.0和4.5,可能会更改结果。例如,如果未在构造函数中指定要使用的锁的数量,则随着字典的增长,它将动态添加更多锁。

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

为了确定这两次写入是否会命中同一个锁,它使用私有方法
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;
}
因此,要回答您最初的问题“多线程不断向字典写入数据时,我能期望良好的性能吗?”答案实际上取决于散列的分布情况,以及您是否会不断插入属于同一锁组的记录。如果不使用真实世界的数据进行测试并查看其性能是否足够,就无法找到答案

还要注意的是,在.NET4.5中,如果使用.NET4.0和4.5,可能会更改结果。例如,如果您没有在构造函数中指定要使用的锁的数量,它将随着字典的增长动态添加更多的锁