.NET проблемы ReaderWriterLockSlim

Существуют партии, записанные о классе ReaderWriterLockSlim, который позволяет, несколько читают и единственная запись. Все они (по крайней мере, что я нашел) говорят, как использовать его без большого объяснения, почему и как это работает. Стандартный пример кода:

lock.EnterUpgradeableReadLock();

try
{
   if (test if write is required)
   {
      lock.EnterWriteLock();

      try
      {
          change the resourse here.
      }
      finally
      {
         lock.ExitWriteLock();
      }
   }
}
finally
{
   lock.ExitUpgradeableReadLock();
}

Вопрос: если обновляемая блокировка разрешает только единственному потоку вводить свой раздел, почему я должен назвать метод EnterWriteLock в? Что произойдет, если я не сделаю? Или что произойдет, если вместо EnterUpgradeableReadLock я назову EnterWriteLock и запишу в ресурс, не используя обновляемую блокировку вообще?

7
задан Jonathan Freeland 20 July 2015 в 12:56
поделиться

3 ответа

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

if (whatever-condition)
{
    lock (_lockObject)
    {
        // the condition may have changed betwen the check and the lock; verify
        // that the condition is still valid
        if (whatever-condition)
        {
            // do the stuff
        }
    }
}

В то же время он не блокирует вызовы к EnterReadLock , поэтому другие потоки могут по-прежнему получать доступ для чтения в других частях кода (и эти вызовы, конечно, будут блокировать вызов EnterWriteLock , пока они не снимут блокировки чтения).

10
ответ дан 6 December 2019 в 14:02
поделиться

если обновляемая блокировка позволяет только одному потоку войти в свой раздел, почему я должен вызывать EnterWriteLock {{1} } внутри метода?

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

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

4
ответ дан 6 December 2019 в 14:02
поделиться

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

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

pm100 - это быстрее, потому что блокировка не является исключительной, так как одновременно может читать много потоков, что может ускорить чтение тяжелых приложений. Фактически, если ваше приложение слишком много пишет, это может быть не лучшим решением для блокировки. Это лучше всего работает, когда модификации вносятся редко, но требуется много чтений.

1
ответ дан 6 December 2019 в 14:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: