我最近遇到了多线程性能问题,并开始研究如何优化当前代码。
最适合我的问题的解决方案是使用读写锁,但是 Jeffrey Richter 的这篇文章让我对使用这种锁产生了一些疑问。我的读者比作者多得多,但是应该尽快应用作者的更改。
这种行为是否仍然存在于 .net 4.5 版本的读写器锁中?我的意思是读线程优先于写线程?
我最近遇到了多线程性能问题,并开始研究如何优化当前代码。
最适合我的问题的解决方案是使用读写锁,但是 Jeffrey Richter 的这篇文章让我对使用这种锁产生了一些疑问。我的读者比作者多得多,但是应该尽快应用作者的更改。
这种行为是否仍然存在于 .net 4.5 版本的读写器锁中?我的意思是读线程优先于写线程?
首先,您应该使用新ReaderWriterLockSlim
类,它比旧类更高效,也避免了许多潜在死锁的情况。
其次,不可能避免写者在写者想要写的时候不得不等待任何已经拥有读(或写)锁的线程——这是读/写锁要求的基本部分。
第三,写者在等待写锁时确实优先于读者。
从文档中ReaderWriterLockSlim.EnterWriteLock()
:
如果其他线程已进入读模式锁,则调用 EnterWriteLock 方法的线程会阻塞,直到这些线程退出读模式。
当有线程等待进入写模式时,其他试图进入读模式或可升级模式的线程会阻塞,直到所有等待进入写模式的线程都超时或进入写模式然后退出。
在这方面它似乎不同于ReaderWriterLock
- 这看起来像是已经修复的事情之一。
这是你能得到的最好的。关键是让读者在尽可能短的时间内保持他们的锁。
另请注意,既不ReaderWriterLock
也不ReaderWriterLockSlim
支持进程间锁。