다중 스레드 C++ 코드의 일부인 개체 생성자에서 전체 복사본을 수행하는 가장 좋은 방법은 무엇입니까?다중 스레드 딥 복사
답변
내 첫 충동 (I 전문가가 아니에요) :
코드가 쓰기에 사용하는 객체에 대한 잠금을 가지고. 전체 복사 작업을 수행 할 때 개체를 잠그고 전체 복사본을 수행 한 다음 잠금을 해제하십시오.
아니면 여기에 뭔가 빠졌습니까?
귀하의 데이터 구조에 따라 다릅니다.
당신이 직면하고있는 문제는 추측 할 수 있지만 (그렇게 말하지는 않지만) 잠재적 인 반전 반전이 될 수 있습니다. 복사가 심한 경우 복사해야하는 다양한 객체에 대해 하나 이상의 잠금을 사용하게됩니다.
노드가 시스템의 모든 잠금 장치 인 DAG (부분 순서)를 정의 할 수 있고 취할 수있는 모든 잠금 조합이 모서리로 연결되어 있으면 잠금을 보장 할 수 있습니다 다른 스레드에서 서로 다른 순서로 처리되지 않습니다. 따라서 특히 잠금 반전은 발생하지 않습니다. 일반적인 규칙은 "가장 일반적인"잠금을 마지막으로 취하는 것입니다.이 잠금은 경합을 최소화하는 경향이 있기 때문입니다.
그러나 기본적으로 구별 할 수없는 "위젯"이 포함 된 "WidgetBoxes"의 전체 집합 중 하나를 전체적으로 복사하는 경우 상자의 내용 사이에 가능한 겹침이 있으므로 자연스럽게 잠금 순서를 정의하는 데 문제가 있습니다. 더구나 WidgetBox를 먼저 잠궈 야합니다 (가장 일반적인 객체 임에도 불구하고). 잠금 기능이 없으면 잠글 필요가있는 항목을 알 수 없기 때문에 먼저 WidgetBox를 잠 가야합니다. 위젯을 비교할 수 있다면 순서대로 잠그고 복사본을 만들고 모든 것을 릴리스 할 수 있습니다. 추잡한.
다른 대안은 모든 위젯과 위젯 상자간에 공유되는 단일 잠금을 정의하는 것입니다. 이것은 많은 경합을 야기 할 수 있으며, 복사와 동시에 많은 수정이 일어나지 않는다면 낙관적 잠금은 사물을 향상시킬 수 있습니다.
또 다른 대안은 복사본에 대한 보장을 완화하는 것입니다. 전체 복사본이 깊은 구조의 식별 가능한 상태에서 만들어 지도록 요구하는 대신, 먼저 WidgetBox를 잠글 수 있습니다 (refcounting 또는 뭐든지 - 참조 횟수의 고정은 일반적으로 "궁극의 내부 잠금"이므로 반전 위험이 아닙니다.) WidgetBox 잠금을 해제 한 다음 각 위젯을 차례대로 복사합니다. 내부 구조가있는 경우 위젯을 복사하는 것과 동일한 방법을 사용하십시오. 그 결과는 다른 스레드의 WidgetBox에서 제거되거나 다른 부적합성이 제거 될 때까지는 달성하지 못한 상태의 위젯을 포함 할 수 있습니다. 허용되지 않는 경우이 접근 방식을 사용할 수 없습니다. 그러나 각 스레드에서 한 번에 하나의 객체 만 잠그면 잠금 반전을 얻을 수 없습니다.
가능한 "핵"옵션은 모든 것을 불변으로 만들고 항상 수정시 복사하는 것입니다. 아무것도 수정할 수 없으면 아무런 잠금이 필요 없습니다 (스레드간에 참조를 전달할 때 여전히 메모리 장벽이 필요함).
이 중 아무 것도 작동하지 않는다면 뭔가를 잊어 버리지 않으면 내 경험에서 벗어났습니다. 나는 데이터베이스 구현이 많은 자물쇠 관련 영리함이 진행되는 곳이라고 생각할 것입니다. 그것은 아이디어를위한 영역이 될 것입니다.
포크()
나는 농담이야.하지만 지나치는 것은 너무 재미있었습니다.
내 생각에 onebyone이 대부분의 옵션을 담당했다고 생각합니다. 당신이 처음에 깊은 사본을하는 것을 피할 수있는 방법을 찾을 수 있다면 뒤로 물러서서보고 계신 것을 제외하고 ...
- 1. 딥 복사 - 포인터 값 복사
- 2. JPA의 딥 복사
- 3. 딥 복사 참조 유형
- 4. NSMutableDictionary의 딥 복사
- 5. 파이썬 C APi 딥 복사
- 6. 동시 파일 복사 작업을위한 파이썬 다중 프로세스/다중 스레드 사용
- 7. 다중 포트를위한 다중 스레드?
- 8. 액세서/뮤 테이타의 얕은/딥 복사 의미론
- 9. copyWithZone : 하위 클래스의 (딥 복사) 오류
- 10. 딥 복사 System.Windows.Forms.WebBrowser 개체/복원 상태
- 11. 다중 스레드 #
- 12. 다중 스레드 다중 클라이언트 프로그래밍
- 13. .NET 다중 스레드 싱크ronronization
- 14. 다중 스레드 JDBC
- 15. JDBC 연결의 다중 스레드
- 16. OpenCV 다중 스레드 호출
- 17. 다중 스레드 NSDocument 종료
- 18. WCF 다중 스레드 호출
- 19. Eclipse에서 다중 스레드 디버그
- 20. VB에서 다중 스레드 ObservableCollection
- 21. Java에서 다중 스레드 구현
- 22. 다중 스레드 및 GDB
- 23. 다중 스레드 오류
- 24. 다중 스레드 데이터베이스 쿼리
- 25. 다중 스레드 및 메모리
- 26. 다중 스레드 힙 관리
- 27. 다중 스레드 처리 문제
- 28. 다중 스레드 문제가있는 FMDB
- 29. 간단한 다중 스레드 질문
- 30. 다중 스레드 정보
여기에 관련된 깊은 사본이기 때문에 그리 쉽지는 않습니다. 오브젝트 그래프에는 서로 다른 데이터 조각에 잠재적으로 많은 잠금이 있습니다. 하나를 놓치거나 교착 상태에 빠지기 매우 쉽습니다. – Andrew