문제

또 다른 동기화 질문 ... 너희들이 짜증이 나지 않기를 바랍니다.)

다음 시나리오를 가정하십시오. 하나의 중앙 데이터 구조 (매우 크게, 실제로는 불변을 만들고 변경 될 때마다 복사하고 싶지 않습니다. 여러 개의 사본을 메모리에 보관하고 싶지 않습니다), 여러 Reader 스레드. 해당 데이터 구조가 읽기 전용 및 하나의 작가 스레드에 액세스하여 데이터 구조를 최신 상태로 유지합니다.

현재 데이터 구조에 대한 모든 액세스를 동기화하는데, 이는 정상적으로 작동합니다 (동기화 효과 없음, 교착 상태 없음). 이 접근법에서 내가 좋아하지 않는 것은 대부분의 시간에 많은 독자 스레드가 활성화되어 있고 작가 스레드는 때때로 활성화된다는 것입니다. 이제 독자 스레드가 다른 독자 스레드가 끝날 때까지 기다릴 때는 완전히 불필요합니다. Writer Thread가 현재 작성되지 않는 한 데이터 구조에 쉽게 액세스 할 수 있습니다.

이런 종류의 시나리오를 해결할 수있는 멋지고 우아한 방법이 있습니까?

편집하다: 답과 링크에 감사드립니다! 또 다른 짧고 관련 질문을 추가하겠습니다. 독자의 임계 섹션 내에서 실행 된 코드가 매우 짧은 시간 (해시 테이블 조회와 같이)만으로도 설명하거나 직렬화 기술 중 하나를 구현하는 것을 고려할 가치가 있습니다. 이 경우 자물쇠의 효과가 그렇게 나쁘지 않습니까? 확장 성과 성능은 매우 중요합니다. 어떻게 생각해?

편집 2 : 방금 단일 작가 / Mulitple Readers의 하나의 구현을 살펴 보았습니다. 이것이 처음부터 피하고 싶었던 것과 동일한 직렬화 효과를 유발하지 않습니까? (여전히 동기화 될 코드가 짧고 빠르다고 가정합니다)

도움이 되었습니까?

해결책

RTL (sysutils)에는 그 목적에 대한 클래스가 있습니다. tmultireadexcluctionwritesynchroniser

사용하기가 매우 쉽습니다. 독자 나 작가와 같은 스레드를 엄격하게 분류 할 필요는 없습니다. 스레드 안전 작동을 시작하기 위해 스레드에서 "시작 읽기"또는 "beginwrite"를 호출하십시오. 작업을 완료하려면 "endread"또는 "endwrite"를 호출하십시오.

다른 팁

당신이 찾고있는 것 (그리고 Vartec이 묘사 한 것)이라고합니다. 독자 (S)-라이터 잠금.

이 문제 해결에 대한 자세한 메모를 찾을 수 있습니다. MSDN 매거진 그리고 MS Windows의 프로그래밍 응용 프로그램에서 발췌.

리더 작가 잠금 장치를 사용하면 문제가 해결됩니다. 여러 독자가 데이터베이스에 액세스 할 수 있으며 모든 독자가 읽은 후에는 작가가 자물쇠를 얻습니다.

그러나 이로 인해 작가는 항상 접근을 원하는 새로운 독자가 있기 때문에 소스에 액세스 할 수 없게 될 수 있습니다. 작가가 접근을 원할 때 새로운 독자를 차단함으로써 해결할 수 있습니다. 작가는 우선 순위가 더 큽니다. 소스의 모든 독자가 읽히면 작가가 액세스 할 수 있습니다.

작가가 접근하기를 원할 때마다 들어오는 독자 (조건에서 기다리도록), 활발한 독자가 끝날 때까지 기다릴 때까지 기다릴 때까지 기다릴 때까지 기다릴 때까지 기다리십시오.

직렬화가 응용 프로그램의 성능에 큰 영향을 미칠지 여부에 대한 질문에 대답 할 수있는 사람은 아무도 없습니다. 직접 프로파일 링해야하며 결과는 스레드, 코어 및 특정 워크로드에 크게 의존합니다.

그러나 Reader-Writer-Lock과 같은 임계 섹션보다 더 영리한 동기화를 사용하면 소개 할 수 있습니다. 굶주림 디버깅하고 수정하기 어려운 문제. 증가 된 처리량이 잠재적 인 문제를 능가하는지 실제로 열심히 살펴 봐야합니다. 특히 잠긴 코드가 매우 짧고 빠른 경우 실제로 처리량이 증가하지 않을 수 있습니다. 이있다 Jeffrey Richter의 멋진 기사 실제로이 인용문이 포함되어 있습니다.

성능 ReaderWriterLock에 대한 논쟁이 없더라도 성능은 매우 느립니다. 예를 들어, AcquiRereAderLock 메소드를 호출하는 것은 모니터의 ENTER 메소드를 호출하는 것보다 실행하는 데 약 5 배 더 오래 걸립니다.

이것은 물론 .NET를위한 것이지만 기본 원칙도 적용됩니다.

독자 작가 잠금 장치는 필요한 것입니다.지도 시간 설명이 있지만 누군가가 이것을 델파이에 표준으로 추가하고 있다고 확신합니다. D2009를 확인하는 것이 이미 없음을 확인할 가치가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top