2009-04-10 2 views
2

article은 부분적으로 만 초기화 된 개체에 대한 참조로 공유 변수를 업데이트 할 수있는 경우 특정 언어/하드웨어 조합에서 이중 검사 잠금이 안전하지 못하다고 말합니다.Ruby에서 이중 잠금이 안전합니까?

나는 궁금한 점이있다 :이 또한 루비에도 적용 되는가? 이것은 실행되는 플랫폼에서 Ruby 구현에 따라 달라 지거나 언어 사양에서 자세히 설명하는 올바른 동작입니까?

+0

여러 구현이 있다는 것을 고려할 때 질문은 어떤 구현인지 그리고 어떤 기본 플랫폼을 지정해야합니다. – MSalters

+0

그게 중요한 포인트입니다. 서로 다른 구현과 플랫폼간에 차이가 있는지 여부를 나타내는 응답은 매우 유익합니다. – Readonly

답변

4

Ruby의 구현은 무엇입니까? Ruby 1.8, 1.9 및 JRuby는 상당히 다른 스레딩 구현을 가지고 있으므로 말하기가 불가능할 수 있습니다.

귀하의 질문에 대한 답변이 없지만 귀하가 Ruby에 빠른 동시 코드를 작성하려고 시도하는 것으로 보입니다. Ruby 1.8에 대한 나의 경험은 이것이 합당한 목표는 아니라는 것이다. 루비 1.9는 더 좋을지 모르지만 여전히 파이썬처럼 전역 인터프리터 락을 가지고 있습니다.

잠재적으로 안전하지 않은 이런 종류의 최적화를 고려하고있는 Ruby 코드를 작성하는 경우 약간의 성능 향상을 위해 다른 언어 사용을 고려해야합니다. 관용적 인 루비는 효율성과 속도가되기 전에 가독성과 표현력을 강조하는 경향이 있습니다. MRI에서 속도를 높이고 신뢰도를 높이려고 노력하는 것이 나를위한 좌절감의 운동이었습니다.

저는 Ruby 프로젝트를 잠시 동안 진행해 왔습니다. 잠시 동안 우리는 진지하게 최적화를 검토하고있는 단계에 들어 섰습니다. JRuby에서 프로젝트를 실행하고 Ruby에서 구현 된 병목 현상을 Java 라이브러리로 대체하면 상대적으로 적은 노력으로 속도와 안정성이 크게 향상되었습니다.

JRuby는 완벽하지는 않지만 Java 통합이 유용하고 쉬운 것으로 입증되었습니다. 프로젝트에 JRuby를 사용할 수 없거나 Java가 아닌 C에 익숙하고 메모리 누출없이 안전한 C를 작성할 수 있다면 Ruby 1.8 또는 1.9에 C 확장을 작성하는 것이 가장 좋은 방법 일 수 있습니다.

이 질문이 완전히 학문적이라면 사과드립니다. 아마도 당신이 정확히 무엇을 하려는지 알려줄 수 있다면?

+0

이것은 사실상 거의 "완전히 학술적"입니다. 어떤 코드에서 여러 스레드가 공유하는 객체의 일부 지연 초기화를 회상하면서이 질문을 물어 보았습니다. 그래서 나는 미래에 그러한 것을 발견 할 수 있었을 것입니다. – Readonly

+0

GIL에 대한 좋은 지적입니다. 한 번에 하나의 스레드 만 실행할 수 있다면 GIL을 사용하여 객체의 인스턴스화와 초기화가 하나의 원자 적 동작으로 발생하는지 확인할 수 있습니다. 이것이 사실인지 확실하지는 않지만 합리적인 설계 결정처럼 들립니다. – Readonly

4

Java에서 이중 검사는 생성자가 실제로 완료되기 전에 변수에 값이 지정 될 수 있기 때문에 위험합니다. 이것은 Ruby에서 발생하지 않습니다. 객체를 생성하는 것은 함수 호출의 결과를 변수에 할당하는 것과 같습니다. 왜냐하면 생성자는 보통 함수이기 때문입니다. 할당은 생성자가 완전히 끝난 후에 만 ​​발생합니다.

MRI에서 할당은 원자 적입니다. 공식 Ruby 언어 나 메모리 모델 사양은 없지만 대안 구현은 가장 모호한 세부 사항까지 MRI의 동작을 모방하려고 노력하는 경향이 있습니다. 할당 문의 원자력 (Atomicity)은 상당히 중요한 행동이므로 대안적인 Ruby 구현에 대한 할당은 원자 적이라고 생각합니다.

실수 하나의 객체가 쓰레기가 중복 때문에, 다음과 같이 || = 연산자를 사용할 수 있습니다 나중에 수집과 경합하는 동안 두 개체를 구성하는 마음을하지 않는 경우 :

@singleton ||= FooBar.new 

을 || = 변수가 아직 설정되지 않은 경우에만 주어진 표현식의 결과를 변수에 원자 적으로 지정합니다. 두 개의 FooBar.new 인스턴스로 끝날 수 있지만 하나만 도달 할 수 있습니다. Ruby on Rails는이 기술을 내부적으로 사용하여 일부 장소에서 뮤텍스를 사용하지 않도록합니다.

0

Dirkjan Bussink (@dbussink)가 RubyConf에서이 주제에 관해 이야기했습니다.일단 대화가 가능 해지면 그의 이야기를 확인하고 싶을 것입니다.

+0

https://www.youtube.com/watch?v=763KOr7LU9Y, 약 20 분 – reto