Как ReaderWriterLock распределяется между потоками? Это реализовано с помощью синглтона? - PullRequest
1 голос
/ 20 апреля 2011

Когда вы хотите использовать ReaderWriterLock, вы объявляете его следующим образом:

ReaderWriterLock rwLock = new ReaderWriterLock;

Хорошо, если вы делаете это для всех ваших различных потоков, которые собираются получить доступ к некоторымресурс, который вы хотите защитить, все они (предположительно) используют разные экземпляры ReaderWriterLock.

Как экземпляр ReaderWriterLock совместно используется потоками?

Также, в качестве бонуса, кто-то может подтвердить для менячто то, что вы действительно"блокируете", является состоянием ReaderWriterLock, а не каким-либо ресурсом.В отличие от lock(someResourceToLock), вы не блокируете ничего, кроме состояния экземпляра ReaderWriterLock (независимо от того, находится ли он в режиме чтения или записи, и разрешено ли вам еще чтение и запись).

Ответы [ 2 ]

2 голосов
/ 20 апреля 2011

Как экземпляр ReaderWriterLock используется несколькими потоками?

Создайте один экземпляр ReaderWriterLock и используйте его из всех потоковкоторые обращаются к общему ресурсу, который вы хотите защитить.

Также в качестве бонуса кто-то может подтвердить для меня, что то, что вы действительно «блокируете», это состояние ReaderWriterLock, а не какой-либо ресурс.В отличие от блокировки (someResourceToLock), вы не блокируете ничего, кроме состояния экземпляра ReaderWriterLock

Вы действительно блокируете.

lock(obj) { ... } это просто сокращение (здесь упрощено,реальная реализация имеет некоторые дополнительные тонкости для обработки краевых случаев):

Monitor.Enter(obj)
  ...
try {
} finally {
  Monitor.Exit(obj);
}

с использованием поля в каждом ссылочном типе для хранения состояния, используемого Monitor.


Как отмечает Марк, рассмотрите ReaderWriterLockSlim, если вам не нужна справедливость (потоки гарантированно вступают в порядке, в котором они начинают ждать), который ReaderWriterLock дает.

2 голосов
/ 20 апреля 2011

Если вы используете ReaderWriterLock rwLock = new ReaderWriterLock для потока или для метода (т.е. в качестве переменной метода), то ваш код, скорее всего, поврежден. Это не синглтон; он полагается на все потоки, которые обращаются к защищенным данным с использованием той же блокировки . Чаще всего это достигается путем помещения замка в поле, т.е.

class Foo {
    ReaderWriterLock rwLock = new ReaderWriterLock();
    // lots of code accessing the rwLock field for this instance
}

Также - возможно, рассмотрим ReaderWriterLockSlim во многих сценариях; меньше накладных расходов Re ваше продолжение; при получении блокировки вы изменяете внутреннее состояние (потокобезопасным способом), чтобы сохранить ожидание «много читателей nand один автор» (возможно, блокирование до тех пор, пока это возможно, т.е. конфликтующие блокировки были удалены). 1013 *

...