2009-08-27 2 views
0

여러 스레드가있는 클래스에서 log4net을 사용하고 있으며 간단한 질문이 있습니다. log4net.ILog 인터페이스에서 속성을 확인하고 메소드를 호출 할 때 readlock/writelock을 입력해야합니까?공유 인터페이스 및 ReaderWriterLockSlim

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

그리고 클래스가 상호 작용 다중 스레드를 포함하기 때문에, 내가 사용하십시오 ReaderWriterLockSlim 인스턴스를 가지고 내가 가진 클래스 상기 상단에 있도록

은 내가 log4net 예에서 제안 된 방법을 사용하고 있습니다 내 변수로 어떤 경쟁 조건에도 빠지지 않도록해야합니다.

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의 인스턴스가 없습니다.

+0

편집 스티븐에게 감사드립니다. 저는 최근에 많은 리눅스 작업을하고 있습니다. 오, 그리고 내가 저항 할 수 없기 때문에 : "sudo는 [스티븐]을 모래로 만든다." –

답변

3

그래서 기본적으로 log4net 스레드로부터 안전할까요? FAQ에서

:

예, log4net는 스레드 안전합니다.

그래서 당신은 간단하게이 작업을 수행 할 수 있습니다

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

멀티 스레드 클래스 내에서 공유 객체로 사용하는 경우에도 여전히 스레드 안전성을 보장하고자했습니다. 나는 그것을 웹 페이지에서 읽었지 만, 그것을 사용하는 데 필요한 방식으로 나에게 엣지 케이스처럼 보였으므로 나는 여전히 (스레드) 안전성을 확보하고 싶었다. –

+0

"스레드 안전성"(.NET 클래스/메서드에 적용될 때)의 정의는 "여러 스레드에서 동시에 사용하는 것이 안전합니다". 공유 객체라는 부분은 부적절합니다. –

+0

"thread-safe"라고 불리는 것이 있다면 이는 추가적인 동기화 코드없이 멀티 스레드 클래스 내의 공유 객체에서 개별 메소드를 호출 할 수 있음을 의미합니다. 물론'IfWarnEnabled'의 반환 값이'If'와'Then' 사이에서 바뀌면, 여러분의 예는 원하지 않는 로그 메시지를 생성 할 수 있습니다. – dtb

1

당신의 위의 예에서, 당신은 당신이 IsWarnEnabled의 값을 변경하지 않는 한 쓰기 잠금을 입력 할 필요가 없습니다. 또한 TryEnterWriteLock을 무한 타임 아웃으로 호출해도 아무런 문제가 없습니다. ReaderWriterLockSlim.EnterWriteLock을 호출 할 수도 있습니다. 그래서, Log4Net는 스레드 안전 (다른 언급 한, 인)되지 않은 경우에도, 당신은 쓸 필요가 : 로그의 값을 변경할 때

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

당신은 다음에 쓰기 잠금을 입력합니다. IsWarnEnabled.

+0

포인트가 패턴입니다. 그 패턴을 따라하면 다시 고려하지 않고도 (-1 외에도) 타임 아웃 값을 쉽게 구현할 수 있습니다. –

+0

물론 이죠, 여기에 와서 코드를 복사하여 붙여 넣는 사람이라면 누구나 할 수 있습니다 .- – zcrar70

+0

Nick! –