Механизм блокировки для Queue‹T› во время Enqueue и Dequeue

В Queue и enqueue, и dequeue требуется блокировка записи. Зачем кому-то использовать ReaderWriterLockSlim, а не просто использовать lock{}? Например,

Использование ReaderWriterLockSlim

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

finally 
{ 
    qLock.ExitWriteLock(); 
} 

По сравнению с блокировкой{}

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

person G33kKahuna    schedule 03.12.2010    source источник
comment
@ Давита, ответ Брайана в данном случае неверен (но обычно это правда). Жаль, что у него 3 голоса.   -  person Samuel Neff    schedule 04.12.2010
comment
спасибо всем откликнувшимся. К сожалению, я не думаю, что у меня есть ответ. Я получаю часть Peek() с помощью EnterReadLock(), но если моя логика просто Enqueue() и Dequeue(), мне все равно нужен EnterWriterLock(). Если я нахожусь в затруднительном положении {} и говорю, что его получение отложено на неопределенный срок или, скажем, очень долго; lock не обеспечивает отказоустойчивости, и можно попасть в тупик или сценарий блокировки. Разве ReaderWriterLock или ReaderWriterLockSlim не предлагают мне вариант отказоустойчивости, чтобы избежать взаимоблокировки или длительной блокировки. мысли? или я не в курсе   -  person G33kKahuna    schedule 05.12.2010


Ответы (3)


Использование ReaderWriterLockSlim в первую очередь является оптимизацией производительности в сценариях, когда много потоков часто читают из ресурса, но лишь несколько потоков пишут в него.

Класс Monitor (используемый оператором блокировки) получает монопольную блокировку ресурса, что означает блокировку как чтения, так и записи. Однако во многих случаях чтение происходит гораздо чаще, чем письмо. В этих сценариях использование блокировки чтения/записи позволяет нескольким читателям одновременно входить в блокировки, но только одному писателю за раз (когда все читатели в очереди отключены).

В вашем примере блокировка чтения/записи имеет смысл только в том случае, если есть другой код, который просматривает очередь, не удаляя элемент из очереди... в противном случае все операции мутируют записи, и оператор lock был бы более подходящее.

person LBushkin    schedule 03.12.2010

Что ж, это по-прежнему позволит читателям Peek не требовать записи lock. Однако трудно представить сценарий, в котором это практически полезно.

person jason    schedule 03.12.2010

В этом случае ReaderWriterLockSlim не дает никакого реального преимущества. Вы правы в том, что и Enqueue, и Dequeue являются операциями записи и требуют монопольной блокировки записи.

Для коллекции, в которой есть операции чтения, как и в большинстве коллекций, лучше использовать ReaderWriterLockSlim, чем всегда использовать lock.

Единственное небольшое преимущество, о котором я мог подумать, это постоянство. Если в большинстве случаев используется ReaderWriterLockSlim, потому что большинство других коллекций используются для большого количества операций чтения и небольшого количества операций записи, то для разработки и обслуживания может быть проще использовать везде ReaderWriterLockSlim.

person Samuel Neff    schedule 03.12.2010