2013-08-07 3 views
1

나는 빠른 Google 검색을 수행했으며 Ruby의 원 자성에 대해 작성된 거의 모든 것이 작업을 둘러싼 뮤텍스 배치를 제안합니다. 그러나이 방법은 신호가 동기화 된 코드를 방해 할 수 있으므로 원 자성의 일반적인 정의를 충족시키지 못한다고 생각합니다. 예를 들어 (Ruby Best Practices에서 가져온) :Ruby에서 원 자성으로 보장/문서화 된 연산/메소드가 있습니까?

lock = Mutex.new 

# XXX this is an example of what NOT to do inside a signal handler: 
trap(:USR1) do 
    lock.synchronize do 
    # if a second SIGUSR1 arrives here, this block of code 
    # will fire again. Attempting Mutex#synchronize twice 
    # the same thread leads to a deadlock error 
    end 
end 

그 자성이 높은 수준의 언어 덜 중요하다 이해하지만, 연구를 위해 나는 GIL와 구현이 문제에 정식 답변을 얻을 싶습니다 (예 : MRI 2.0.0) 없이JRuby 1.7.4 및 Rubinius 1.2.4

+0

루비 엔진과 버전은 무엇입니까? –

+0

Ruby의 원자 적 연산 : http://moonbase.rydia.net/mental/blog/programming/atomic-operations-in-ruby.html – ChrisInEdmonton

+0

MRI는 [GIL] (https://en.wikipedia.org/wiki/Global_Interpreter_Lock) 때문에 JRuby 및 Rubinius와 매우 다릅니다. –

답변

1

이 주제에 대한 지식은 매우 제한적입니다. 하지만 최대한 최선을 다해 답변하려고 노력할 것입니다.

Jesse Storimer가 동시성에 대해 작성한 기사가 아주 훌륭합니다. 나는 그것에 대해 3 가지 부분 모두를 읽어 주길 강력히 권합니다. 2 부

http://www.jstorimer.com/blogs/workingwithcode/8100871-nobody-understands-the-gil-part-2-implementation

결론 GIL은 네이티브 C 방법을 구현 원자 것을 보장한다는 것이다.

당신이 준 예제는 실제로 원자 성 (re-entrance problem)이 더 많습니다. 그것이 똑같은지 또는 그것이 얼마나 밀접한 관련이 있는지 나는 모른다.

루비는 콜백이 동기 인 이벤트 구동 프로그래밍과 다르다. 즉, 신호 USR1을 두 번 보내면 첫 번째 핸들러가 완료된 후 두 번째 핸들러가 실행된다는 의미이다. 따라서 뮤텍스를 두 번 고정하지 마십시오.

그러나 루비의 신호 처리는 비동기입니다. 신호를 두 번 보내는 경우에 해당됩니다. 두 번째 핸들러는 첫 번째 핸들러를 인터럽트합니다. 첫 번째 잠금이 이미 잠금을 획득 했으므로 동일한 잠금을 획득하려고 시도하는 두 번째 핸들러는 예외를 throw합니다. 그리고 나는이 문제가 루비와 관련이 없다고 생각한다.

이 문제를 해결하는 방법 중 하나는 신호 처리를 수행 할 대기열을 만드는 것입니다. 이것에 대한 또 다른 해결책은 "자체 파이프"트릭이라고하는 방법을 사용하는 것입니다. 둘 다. 다시 멋진 제시 Storimer하여이 문서에 설명되어 있습니다 : 루비는 네이티브 C 방법은 원자 것을 보장 할 수 있도록

http://rubysource.com/the-self-pipe-trick-explained/

그래서, MRI 2.0.0에 대한 , 나는 여전히 믿고 GIL을 가지고있다.

JRuby를가 JVM은 백업입니다 그래서 내 생각은 그래서 난이 MRI와 같은 것으로 판단 스레드의 모든이며, 잠금 장치하는 것은 또한 여전히 GIL이 JVM

Rubinius 1.2의 상단에 구현된다. 그러나 Rubinius 2.x는 GIL을 제거합니다. Rubinius에 대한 많은 경험이 없었기 때문에 Rubinius에 대해 전혀 확신하지 못했습니다.

그리고 루비에서 멀티 스레드 응용 프로그램으로 작업하는 경우 질문에 대답하십시오. 뮤텍스 클래스는 블록이 한 번에 하나의 스레드에 의해서만 실행된다는 것을 보장해야합니다.