2008-10-06 6 views

답변

-1

내 첫 충동 (I 전문가가 아니에요) :

코드가 쓰기에 사용하는 객체에 대한 잠금을 가지고. 전체 복사 작업을 수행 할 때 개체를 잠그고 전체 복사본을 수행 한 다음 잠금을 해제하십시오.

아니면 여기에 뭔가 빠졌습니까?

+1

여기에 관련된 깊은 사본이기 때문에 그리 쉽지는 않습니다. 오브젝트 그래프에는 서로 다른 데이터 조각에 잠재적으로 많은 잠금이 있습니다. 하나를 놓치거나 교착 상태에 빠지기 매우 쉽습니다. – Andrew

4

귀하의 데이터 구조에 따라 다릅니다.

당신이 직면하고있는 문제는 추측 할 수 있지만 (그렇게 말하지는 않지만) 잠재적 인 반전 반전이 될 수 있습니다. 복사가 심한 경우 복사해야하는 다양한 객체에 대해 하나 이상의 잠금을 사용하게됩니다.

노드가 시스템의 모든 잠금 장치 인 DAG (부분 순서)를 정의 할 수 있고 취할 수있는 모든 잠금 조합이 모서리로 연결되어 있으면 잠금을 보장 할 수 있습니다 다른 스레드에서 서로 다른 순서로 처리되지 않습니다. 따라서 특히 잠금 반전은 발생하지 않습니다. 일반적인 규칙은 "가장 일반적인"잠금을 마지막으로 취하는 것입니다.이 잠금은 경합을 최소화하는 경향이 있기 때문입니다.

그러나 기본적으로 구별 할 수없는 "위젯"이 포함 된 "WidgetBoxes"의 전체 집합 중 하나를 전체적으로 복사하는 경우 상자의 내용 사이에 가능한 겹침이 있으므로 자연스럽게 잠금 순서를 정의하는 데 문제가 있습니다. 더구나 WidgetBox를 먼저 잠궈 야합니다 (가장 일반적인 객체 임에도 불구하고). 잠금 기능이 없으면 잠글 필요가있는 항목을 알 수 없기 때문에 먼저 WidgetBox를 잠 가야합니다. 위젯을 비교할 수 있다면 순서대로 잠그고 복사본을 만들고 모든 것을 릴리스 할 수 있습니다. 추잡한.

다른 대안은 모든 위젯과 위젯 상자간에 공유되는 단일 잠금을 정의하는 것입니다. 이것은 많은 경합을 야기 할 수 있으며, 복사와 동시에 많은 수정이 일어나지 않는다면 낙관적 잠금은 사물을 향상시킬 수 있습니다.

또 다른 대안은 복사본에 대한 보장을 완화하는 것입니다. 전체 복사본이 깊은 구조의 식별 가능한 상태에서 만들어 지도록 요구하는 대신, 먼저 WidgetBox를 잠글 수 있습니다 (refcounting 또는 뭐든지 - 참조 횟수의 고정은 일반적으로 "궁극의 내부 잠금"이므로 반전 위험이 아닙니다.) WidgetBox 잠금을 해제 한 다음 각 위젯을 차례대로 복사합니다. 내부 구조가있는 경우 위젯을 복사하는 것과 동일한 방법을 사용하십시오. 그 결과는 다른 스레드의 WidgetBox에서 제거되거나 다른 부적합성이 제거 될 때까지는 달성하지 못한 상태의 위젯을 포함 할 수 있습니다. 허용되지 않는 경우이 접근 방식을 사용할 수 없습니다. 그러나 각 스레드에서 한 번에 하나의 객체 만 잠그면 잠금 반전을 얻을 수 없습니다.

가능한 "핵"옵션은 모든 것을 불변으로 만들고 항상 수정시 복사하는 것입니다. 아무것도 수정할 수 없으면 아무런 잠금이 필요 없습니다 (스레드간에 참조를 전달할 때 여전히 메모리 장벽이 필요함).

이 중 아무 것도 작동하지 않는다면 뭔가를 잊어 버리지 않으면 내 경험에서 벗어났습니다. 나는 데이터베이스 구현이 많은 자물쇠 관련 영리함이 진행되는 곳이라고 생각할 것입니다. 그것은 아이디어를위한 영역이 될 것입니다.

0

포크()

나는 농담이야.하지만 지나치는 것은 너무 재미있었습니다.

내 생각에 onebyone이 대부분의 옵션을 담당했다고 생각합니다. 당신이 처음에 깊은 사본을하는 것을 피할 수있는 방법을 찾을 수 있다면 뒤로 물러서서보고 계신 것을 제외하고 ...