Механизм блокировки для очереди <T>во время постановки и снятия очереди - PullRequest
4 голосов
/ 04 декабря 2010

В очереди для постановки в очередь и выгрузки требуется блокировка записи.Почему кто-то использует 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)
} 

Ответы [ 3 ]

5 голосов
/ 04 декабря 2010

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

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

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

3 голосов
/ 04 декабря 2010

Ну, это все равно позволило бы читателям Peek без необходимости записи lock.Трудно представить сценарий, когда это практически полезно.

2 голосов
/ 04 декабря 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...