ReaderWriterLockSlim与Monitor

Rau*_*otz 5 c# multithreading locking readerwriterlock

我有一个IDictionary<TKey,TValue>内部持有另一个的实现,Dictionary<TKey, TValue>并通过密钥的HashCode将插入分发到invidual子字典.有16个子词典,4核机器上的冲突数量相当低.

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

  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();
            }
        }
Run Code Online (Sandbox Code Playgroud)

插入四个线程的项目时,我只有大约32%的CPU使用率和糟糕的性能.所以我用Monitor(即lock关键字)替换了ReaderWriterLockSlim .CPU使用率现在接近100%,性能提高了一倍多.

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

小智 13

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