Является ли ReaderWriterLockSlim.EnterUpgradeableReadLock() по существу тем же, что и Monitor.Enter()?

Итак, у меня есть ситуация, когда у меня может быть много, много чтений и только случайная запись на ресурс, разделяемый между несколькими потоками.

Долгое время я читал о ReaderWriterLock и читал о ReaderWriterGate, который пытается смягчить проблему, когда многие записи входящий в козырь читает и болит производительность. Однако теперь мне стало известно о ReaderWriterLockSlim...

Из документов, я считаю, что в один только момент может быть только один поток в "обновляемом режиме". В ситуации, когда единственный доступ, который я использую, EnterUpgradeableReadLock() (что подходит для моего сценария), есть большая разница только с придерживаясь lock(){}?

Здесь выдержка:

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

Или политика рекурсии имеет значение для этого?

Ответ 1

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

Ответ 2

У меня нет всех ваших ответов, но я сделаю снимок:

Оператор блокировки в С# является синтаксическим сахаром для вызова Monitor.Enter и Monitor.Exit. Эффект заключается в том, что только один поток может получить доступ к коду внутри замка за раз.

lock()
{
  //only one thread can access this code at a time
}

Проблема заключается в том, что множественные чтения являются безвредными, но блокировка() блокирует в любом случае. ReaderWriterLockSlim допускает множественные чтения, только одну запись. Это попытка повысить эффективность.

Политика рекурсии - это то, что вы должны указать - по умолчанию она отключена. Не знаю слишком много за этим, но надеюсь, что это поможет немного.