我最近遇到了多线程性能问题,并开始研究如何优化当前代码。
我的问题最合适的解决方案是使用读写器锁定,但杰弗里里希特的article让我对使用这种锁有一些疑问。我有更多的读者,然后作家,但作家的变化应该尽快应用。
此行为是否仍然保留在.net 4.5版本的readerwriter锁中?读者线程优先于写入程序线程?
答案 0 :(得分:2)
首先,您应该使用新的ReaderWriterLockSlim
类,它比旧的更有效,并且还避免了许多潜在的死锁情况。
其次,不可能避免编写者必须等待编写者想要写入时已经具有读(或写)锁的任何线程 - 这是读者需求的基本部分/作家锁。
第三,作者在等待写锁定时优先于读者。
来自ReaderWriterLockSlim.EnterWriteLock()
的文档:
如果其他线程在读取模式下进入锁定状态,则调用EnterWriteLock方法的线程会阻塞,直到这些线程退出读取模式。
当有线程等待进入写入模式时,尝试进入读取模式或可升级模式块的其他线程,直到等待进入写入模式的所有线程都超时或进入写入模式然后退出强>
在这方面它似乎与ReaderWriterLock
不同 - 这看起来像是已修复的事情之一。
这是你能得到的最好的。关键是读者可以在最短的时间内保持锁定。
另请注意,ReaderWriterLock
和ReaderWriterLockSlim
都不支持进程间锁定。