入队和出队时队列<t>的锁定机制</t>

时间:2010-12-03 22:05:47

标签: c# multithreading thread-safety

在队列中,入队和出列都需要写锁定。为什么有人会使用ReaderWriterLockSlim而不是使用lock {}?例如,

使用ReaderWriterLockSlim

qLock.EnterWriteLock(); 
try 
{ 
    localQ.Enqueue(item); // or localQ.Dequeue(item)
} 

finally 
{ 
    qLock.ExitWriteLock(); 
} 

Versus lock {}

try 
{ 
    lock(qLock) { localQ.Enqueue(item);} // or localQ.Dequeue(item)
} 

3 个答案:

答案 0 :(得分:5)

ReaderWriterLockSlim的使用主要是在有许多线程经常从资源读取但只有少数线程写入其中的情况下进行性能优化。

Monitor类(由lock语句使用)获取资源的独占锁定 - 这意味着读取器和写入器都被阻止。然而,在许多情况下,阅读比写作更频繁。在这些情况下,使用读取器/写入器锁允许多个读取器同时输入锁定,但一次只能输入一个写入器(当所有排队读取器都出来时)。

在您的示例中,读取器/写入器锁仅在有其他代码在没有对项目进行取消的情况下查看队列时才有意义 ...否则所有操作都在改变写入,并且{{ 1}}陈述会更合适。

答案 1 :(得分:3)

嗯,这仍然允许读者Peek而不需要写lock。很难想象这个实际上有用的场景。

答案 2 :(得分:2)

在这种情况下,ReaderWriterLockSlim没有提供任何真正的优势。你是对的,EnqueueDequeue都是写操作,需要独占写锁。

对于具有读取操作的集合,与大多数集合一样,那么ReaderWriterLockSlim将比使用lock更好。

我能想到的唯一小优势是一致性。如果在大多数地方使用ReaderWriterLockSlim,因为大多数其他集合用于大量读取和少量写入,那么开发和维护就更容易在任何地方使用ReaderWriterLockSlim