【发布时间】:2009-01-02 16:04:29
【问题描述】:
我有一个 IDictionary<TKey,TValue> 实现,它在内部拥有 n 个其他 Dictionary<TKey, TValue> 并通过键的 HashCode 将插入分发到各个子字典。有 16 个子字典,在 4 核机器上冲突的数量非常少。
对于并行插入,我用 ReaderWriterLockSlim 锁定了 Add-method,只锁定了单个子字典:
public void Add(TKey key, TValue value)
{
int poolIndex = GetPoolIndex(key);
this.locks[poolIndex].EnterWriteLock();
try
{
this.pools[poolIndex].Add(key, value);
}
finally
{
this.locks[poolIndex].ExitWriteLock();
}
}
当使用四个线程插入项目时,我只得到了大约 32% 的 cpu 使用率和糟糕的性能。所以我用监视器(即lock 关键字)替换了 ReaderWriterLockSlim。
CPU 使用率现在接近 100%,性能提高了一倍以上。
我的问题是:为什么 CPU 使用率会增加?碰撞次数不应改变。是什么让 ReaderWriterLock.EnterWriteLock 等了这么多次?
【问题讨论】:
标签: c# multithreading locking readerwriterlock