Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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# ReaderWriterLockSlim vs.Monitor_C#_Multithreading_Locking_Readerwriterlock - Fatal编程技术网

C# ReaderWriterLockSlim vs.Monitor

C# ReaderWriterLockSlim vs.Monitor,c#,multithreading,locking,readerwriterlock,C#,Multithreading,Locking,Readerwriterlock,我有一个IDictionary实现,它在内部保存n个其他字典,并通过键的HashCode将插入的内容分发给invidual子字典。有16个子字典,4核机器上的冲突数量非常少 对于并行插入,我使用ReaderWriterLockSlim锁定Add方法,仅锁定单个子字典: public void Add(TKey key, TValue value) { int poolIndex = GetPoolIndex(key); this

我有一个
IDictionary
实现,它在内部保存n个其他
字典
,并通过键的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使用率和糟糕的性能。因此,我用一个监视器(即
lock
关键字)替换了ReaderWriterLockSlim。 CPU使用率现在接近100%,性能提高了一倍多


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

我不是专家,但我的猜测是,RWLS更适合于严重的争用(例如,数百个线程),而
Monitor
更适合于那些一次性的同步问题


就我个人而言,我使用了一个
TimerLock
类,该类使用带有超时参数的
Monitor.TryEnter

您如何知道是什么导致了性能不佳?你不能去猜,唯一的办法是做一些分析

您如何处理父集合的锁定,还是它是常量


也许您需要添加一些调试输出,看看真正发生了什么?

对于只写加载,监视器比ReaderWriterLockSlim便宜,但是,如果您模拟读写加载,其中读写比写大得多,则ReaderWriterLockSlim应该超出监视器。

集合本身没有被锁定,只有子字典。性能好坏之间唯一的区别是显示器替换了ReaderWriterLock。您所说的改进可能只是一个副作用。唯一知道的方法是做一些分析。也许是调试跟踪。如果父集合未锁定且发生更改,则可能无法工作。