Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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# 队列的锁定机制<;T>;在排队和退队期间_C#_Multithreading_Thread Safety - Fatal编程技术网

C# 队列的锁定机制<;T>;在排队和退队期间

C# 队列的锁定机制<;T>;在排队和退队期间,c#,multithreading,thread-safety,C#,Multithreading,Thread Safety,在队列中,入队列和出队列都需要一个写锁。为什么有人会使用ReaderWriterLockSlim而不是只使用锁{}?例如, 使用ReaderWriterLockSlim qLock.EnterWriteLock(); try { localQ.Enqueue(item); // or localQ.Dequeue(item) } finally { qLock.ExitWriteLock(); } 对锁{} try { lock(qLock) {

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

使用ReaderWriterLockSlim

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

finally 
{ 
    qLock.ExitWriteLock(); 
} 
对锁{}

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

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

对于像大多数集合一样具有读取操作的集合,
readerwriterlocksim
比始终使用
lock
要好


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

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

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


在您的示例中,读写器锁只有在有其他代码窥视队列而不释放项时才有意义。。。否则,所有操作都是变异写操作,而
lock
语句更合适。

好吧,这仍然允许读者在不需要写
锁的情况下
Peek
。然而,很难想象这样做会有什么实际用处。

@Davita,布莱恩的回答在这种情况下是错误的(但通常是正确的)。不幸的是,由于大家的反应,它获得了3张赞成票。不幸的是,我想我还没有答案。我使用EnterReadLock()获得Peek()部分,但是如果我的逻辑只是Enqueue()和Dequeue(),那么不管怎样,我都需要EnterWriterLock()。如果我在锁里,说它的获取被无限期延迟或者说很长时间;锁不提供容错功能,并且有可能进入死锁或阻塞场景。ReaderWriterLock或ReaderWriterLockSlim不会为我提供一个容错选项来避免死锁或长阻塞吗。思想?还是我偏离了航线