2011-01-11 5 views
27

간단히 말해서, Ruby thread-safe의 표준 라이브러리 Logger 클래스입니까? Google이 발견 한 유용한 정보는 포럼에서 스레드로부터 안전하다고 판단되는 사람입니다. 그리고 나는 로거를 시험해 보느냐 그렇지 않은가를 알아내는 데 시간을 보내는 것을 좋아하지 않는다.Ruby의 stdlib Logger 클래스는 스레드로부터 안전한가요?

당분간 나는 thread-safe 인 log4r을 사용하고있다. 그러나 표준 라이브러리가 이미 그것을한다면 그것은 과도하다. 나는 그것이 스레드 안전 올바른를 얻을 수 있는지에 대한 신뢰도를 보장 할 수 없습니다 동안 그래서, 나는 그것을 만드는 것을 확인할 수

def write(message) 
    @mutex.synchronize do 
    if @shift_age and @dev.respond_to?(:stat) 
     begin 
     check_shift_log 
     rescue 
     raise Logger::ShiftingError.new("Shifting failed. #{$!}") 
     end 
    end 
    @dev.write(message) 
    end 
end 

을 :

답변

44

는 logger.rb에서 빠른 보면 다음과 같은 코드를 보여준다 바르게 할 공동의 노력!

P.

-1

다음은 실제로 원래 인 원래 응답입니다. 코드를 읽으면 다음과 같은 질문에 쉽게 답변 할 수 있습니다. 아래 Nemo157의 의견을 읽으십시오. 나는 그것을 참조 용으로 여기에두고 갔다.

원본 :

내가 중요한 생각하지 않습니다. 내가 지금까지 알고있는 Ruby의 모든 구현은 어쨌든 한 번에 하나의 스레드 만 실행합니다. 많은 스레드를 시작할 수 있지만 프로세스 당 한 번에 하나의 스레드 만 실행합니다.

+8

그렇습니다.하지만 하나의 스레드 만 멀티 스레드 루비 코드를 thread 세이프로 만들지는 않습니다. 원자 연산이 여러 문에 걸쳐있을 수 있기 때문에 스레드 안전성을 보장하지 못합니다. 예 : 'x = point.x; point.x = x + 1'이면 스레드는 두 문장 사이에서 인터럽트 될 수 있고 다른 스레드는이 스레드가 다시 시작할 때 덮어 쓰여지는'point.x'의 값을 수정할 수 있습니다. 또한 JRuby는 Java 스레드를 사용하기 때문에 실제로 멀티 스레드입니다. – Nemo157

+0

좋은 지적. 원래 응답을 참조로 남겼습니다. – kirakun

0

일부 Ruby 클래스는 스레드로부터 안전하지만, 설명서의 한 음절에 명시 적으로 말하지 않습니다. PHP와 같은 다른 프로그래밍 언어의 문서와는 다릅니다.

Queue이 스택 오버플로에서 스레드로부터 안전한지 여부를 묻는 메시지가 기억납니다. 문서 였더라도 그 내용을 자세히 설명하지 않았습니다.

관련 문제