因此,我的理解是,在ReaderWriterLock (或者更具体地说,ReaderWriterLockSlim )上,读和写都需要获取互斥来获取锁。我想优化锁的读访问,这样如果没有写挂起,就不需要获取锁。(我愿意牺牲写操作的性能,为读操作添加一些约束,使第一次读操作变慢,第二次读变快,等等。如果需要,只要读取的绝大多数都是尽可能快的。)
那么,如何做到这一点,或者更好的是,有没有一个框架或“标准”实现可以向我指出?(或者如果我误解了,但它已经得到了支持,那就太好了!)
因此,对于我的文章:似乎如果一个人有一个读取器/写入器数量的计数器(由Interlocked.Increment保护),这将足以让读取器检查写入器计数是否是非零,并且只在那时获得锁。(如果获取了锁,则在锁中递增。)
写入器总是递增,获取锁,旋转,直到读取器计数变为0(愿意假设读取器总是快速完成,或者甚至在乐观的情况下完全绕过读取器计数),最后递减。(当我们阻塞或可能在一次传递中清除所有挂起的读取器/写入器时,也可以抛出某种形式的优先级,因为我只保护一个值,但我现在放弃这一点。)
所以..。有没有人看到过类似的东西或有什么建议?如果过了一段时间什么都没有了,我很乐意把最初的实现组合在一起,然后更具体地谈谈。
发布于 2009-10-16 15:33:50
你所描述的,在基本层面上,已经是读取器/写入器锁是如何工作的。它们不需要取出互斥锁,因为读取器/写入器锁通过使用读取器和写入器的内部计数来控制访问(实际上,互斥锁意味着读取器将相互阻塞,而实际上允许多个并发读取器--这就是锁类型的全部意义!)。
所以,是的,有一个框架/标准实现:ReaderWriterLockSlim。我真的怀疑你能写出比这更好的读/写锁。在任何情况下--您确定这个锁是性能问题的根源吗?
发布于 2009-10-16 15:34:55
恐怕你错了,因为ReaderWriterLockSlim是基于自旋锁定的,而不是基于互斥的(你可以在Reflector中看到这一点)。
https://stackoverflow.com/questions/1578777
复制相似问题