2009-08-27 56 views
0

我使用log4net的在多線程類,我有一個簡單的問題。在log4net.ilog界面上檢查屬性並調用方法時,是否需要輸入readlock/writelock?共同的接口和ReaderWriterLockSlim

我使用從log4net的例子所提出的方法,以便在上面說I類有:

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") 

附:是的,這是粗略的僞代碼,我實際上沒有一個名爲'ReaderWriterLockSlim'的實例ReaderWriterLockSlim

+0

感謝您的編輯史蒂芬,我一直在做得多Linux的工作最近。哦,因爲我無法抗拒:「sudo make [steven] sandhatich」。 – 2009-08-27 20:54:27

回答

3

所以你基本上要知道,如果log4net的是線程安全的?

FAQ

是的,log4net的是線程安全的。

所以,你可以簡單地這樣做:

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

即使將它用作多線程類中的共享對象,我也想確保它仍然是線程安全的。我確實從網頁上讀到了這個消息,但由於我需要使用它的方式對我來說似乎是一個邊緣案例,所以我想確保我仍然是(線程)安全的。 – 2009-08-27 20:50:44

+0

「線程安全」的定義(當施加到.NET類/方法)是「安全地從多個線程同時使用」。關於它是共享對象的部分是無關緊要的。 – 2009-08-27 21:01:55

+0

如果某些東西被稱爲「線程安全」,這意味着可以在多線程類中的共享對象上調用各個方法,而無需額外的同步代碼。當然,如果'IsWarnEnabled'的返回值在'If'和'Then'之間改變,你的例子可能會產生不需要的日誌消息。 – dtb 2009-08-27 21:07:33

1

在你上面的例子,你並不需要輸入你不是改變IsWarnEnabled的值寫入鎖定。另外,調用TryEnterWriteLock時沒有任何意義,可以調用ReaderWriterLockSlim.EnterWriteLock。所以,即使是log4net的不是線程安全的(這正如其他人所說,這是),你只需要編寫:

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

改變日誌的價值時,你會再輸入一個寫鎖。 IsWarnEnabled。

+0

重點在於模式。通過遵循該模式,我可以輕鬆實現超時值(除了-1),而無需重新分解。 – 2009-09-12 10:17:09

+0

當然,我只是想澄清它爲任何來這裏複製和粘貼你的代碼:-) – zcrar70 2009-09-17 09:20:33

+0

有道理,非常感謝尼克! – 2009-12-07 18:17:13