Оптимизированный доступ для чтения ReaderWriterLock
Таким образом, я понимаю, что в ReaderWriterLock (или, более конкретно, в ReaderWriterLockSlim) и для чтения, и для записи необходим мьютекс для блокировки. Я хотел бы оптимизировать доступ на чтение для блокировки, чтобы при отсутствии ожидающих записей блокировку не нужно было получать. (И я готов пожертвовать производительностью записи, добавить некоторые ограничения к чтению, сделать первое чтение медленным, а второе быстрым и т. Д., Если необходимо, до тех пор, пока подавляющее большинство операций чтения выполняется максимально быстро.)
Итак, как можно это сделать, или, что еще лучше, есть ли какая-то структура или "стандартная" реализация, на которую я мог бы указать? (Или, если я неправильно понял, и это уже поддерживается, отлично!)
Итак, для моей части: Казалось бы, если бы был счетчик количества читателей / писателей (защищенный Interlocked.Increment), этого было бы достаточно, чтобы читатель проверил, было ли число писателей ненулевым, и только получить замок тогда. (И увеличение в пределах блокировки, если получено.)
Авторы всегда будут увеличивать, получать блокировку, вращаться до тех пор, пока число читателей не станет равным 0 (желая предположить, что читатели всегда быстро заканчивают работу, или даже полностью игнорировать число читателей в оптимистическом сценарии), и, наконец, уменьшить. (Было бы неплохо также добавить какой-либо приоритет формы, когда мы блокируем, или, возможно, очистить всех ожидающих читателей / писателей за один проход, поскольку я защищаю только одно значение, но пока я воздержусь от этого...)
Так.. кто-нибудь видел что-нибудь подобное или есть предложение? Если через некоторое время ничего не получится, я был бы рад собрать начальную реализацию и поговорить более конкретно.
2 ответа
На базовом уровне вы уже описали, как блокировка чтения / записи работает. Им не нужно извлекать мьютекс, поскольку блокировка чтения / записи контролирует доступ, используя внутренний счетчик читателей и писателей (и, действительно, мьютекс подразумевает, что читатели будут блокировать друг друга, тогда как на самом деле несколько одновременных читателей разрешено - вот и весь смысл типа блокировки!).
Так что да, для этого есть фреймворк / стандартная реализация: ReaderWriterLockSlim
, Я действительно сомневаюсь, что вы сможете написать блокировку чтения / записи с лучшей производительностью, чем эта. В любом случае - уверены ли вы, что эта блокировка является причиной ваших проблем с производительностью?
Боюсь, вы не правы, поскольку ReaderWriterLockSlim основан на спин-блокировке, а не на мьютексах (вы можете увидеть это в Reflector).