ReaderWriterLockSlim与Monitor

我有一个IDictionary实现,它在内部保存另一个Dictionary并通过密钥的HashCode将这些插入分发到invidual子词典。 有16个子词典,4核机器上的冲突数量非常少。

对于并行插入,我使用ReaderWriterLockSlim锁定Add方法,仅锁定单个子字典:

  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使用率和糟糕的性能。 所以我用Monitor替换了ReaderWriterLockSlim(即lock关键字)。 CPU使用率目前接近100%,性能提高了一倍多。

我的问题是:为什么CPU使用率会增加? 碰撞次数不应该改变。 是什么让ReaderWriterLock.EnterWriteLock等了这么多次?

对于只写加载,Monitor比ReaderWriterLockSlim便宜,但是,如果你模拟read + write load,其中read远大于write,那么ReaderWriterLockSlim应该执行Monitor。

我不是大师,但我的猜测是RWLS更倾向于争用激烈(例如,数百个线程),而Monitor更倾向于那些一次性同步问题。

我个人使用TimerLock类,它使用Monitor.TryEnter和timeout参数。

你怎么知道导致糟糕表现的原因? 你无法猜测它,唯一的方法是进行某种分析。

你如何处理父集合的锁定或它是不变的?

也许你需要添加一些调试输出,看看到底发生了什么?