Общий интерфейс и ReaderWriterLockSlim - PullRequest
0 голосов
/ 28 августа 2009

Я использую log4net в классе с несколькими потоками, и у меня возник простой вопрос. Нужно ли вводить блокировку чтения / записи при проверке свойств и вызове методов в интерфейсе log4net.ILog?

Я использую предложенный метод из примеров log4net, поэтому в верхней части указанного класса у меня есть:

Private Shared ReadOnly log As log4net.ILog = log4net.LogManager.GetLogger(decType) 

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

If Me.ReaderWriterLockSlim.TryEnterUpgradableReadLock(-1) Then
  If log.IsWarnEnabled Then
    If Me.ReaderWriterLockSlim.TryEnterWriteLock(-1) Then
      log.Warn("Log Message Here")
      Me.ReaderWriterLockSlim.ExitWriteLock()
    End If
  End If
  Me.ReaderWriterLockSlim.ExitUpgradeableReadLock()
End If

Или я могу просто сделать это:

If log.IsWarnEnabled Then log.Warn("Log Message Here")

P.S. Да, это грубый псевдокод, на самом деле у меня нет экземпляра ReaderWriterLockSlim, который называется 'ReaderWriterLockSlim'.

Ответы [ 2 ]

3 голосов
/ 28 августа 2009

Итак, вы в основном хотите знать, безопасен ли log4net для потоков?

Из FAQ :

Да, log4net является поточно-ориентированным.

Так что вы можете просто сделать это:

If log.IsWarnEnabled Then log.Warn("Log Message Here")
1 голос
/ 11 сентября 2009

В приведенном выше примере вам не нужно вводить блокировку записи, так как вы не меняете значение IsWarnEnabled. Кроме того, нет смысла вызывать TryEnterWriteLock с бесконечным временем ожидания - вы также можете вызвать ReaderWriterLockSlim.EnterWriteLock. Таким образом, даже если Log4Net не является поточно-ориентированным (что, как уже упоминали другие, это так), вам просто нужно написать:

readerWriterLock.EnterReadLock();
try
{
  if(log.IsWarnEnabled)
    log.Warn("log message here");
}
finally
{
  readerWriterLock.ExitReadLock();
}

Затем вы вводите блокировку записи при изменении значения log.IsWarnEnabled.

...