2012-10-19 2 views
1

필자는 최근 스킵 목록 데이터 구조를 사용하여 동시 우선 순위 대기열을 구현하는 데 찔렀다.이 질문을 위해 스킵 목록이 무엇인지 모르는 경우 링크 된 목록을 그리는 것이 대답하기에 충분합니다. 가능한 한 빨리 잠금을 해제하고 Interlocked를 사용하여 목록을 트래버스하는 등의 최소한의 잠금을 시도했습니다 (즉, 여러 대기열 및 대기열에서 동시에 대기열 허용, 필요한 경우 노드 또는 순방향 포인터 잠금 만 가능).성능 향상을 위해보다 세분화 된 잠금이 더 좋은 시점은 언제입니까?

나는 결과에 만족했다. 그러나 syncroot lock으로 둘러싸인 추가 및 삭제 (즉, 주어진 시간에 하나의 작업 만 허용)로 일반 skiplist 작성은 실제로 두 배 빠릅니다.

구현에 버그가 있다고 가정했습니다. 그러나 Microsoft 웹 사이트에 나와 심지어 '동시 우선 순위 큐는'실제로 한 번에 하나의 작업을 허용 (예 : 대기열에서 주위 syncroot 잠금) 원칙적으로

http://code.msdn.microsoft.com/Samples-for-Parallel-b4b76364/sourcecode?fileId=44488&pathId=1696822056

(그리고 이 질문이 너무 일반적이라면 나를 용서해주십시오.), 어느 시점에서보다 세분화 된 잠금이 실제로 성능 향상으로 이어지나요? 필자는 실제로 Interlocked.Exchange (더 좋은 방법이 있습니까?)뿐만 아니라 여러 테스트 및 테스트 및 세트 등으로 큰 목록을 트래버스해야하므로이 경우 엔큐 및 대기열에서 제외됩니다.

또한 대부분의 시간을 어디에 사용했는지 확인할 수있는 도구가 있습니까? 감사.

답변

3

지속적으로 떠날 때 해제 후 잠긴 지역은 현재 무료 인 경우, 검사 잠금을 설정, 그리고 오버 헤드가 있습니다에서보세요. 실제로, 중요한 부분에 액세스하기 위해 다른 사람과 실제로 경쟁하는 경우는별로 도움이되지 않는 오버 헤드를 수행했습니다. 반면에 데이터 구조를 사용하려고하는 스레드가 많고 많은 경우 병렬로 실행되는 성능 향상 (많은 CPU가있는 경우)이 잠금 관리 오버 헤드를 초과한다는 것을 알 수 있습니다.

이러한 유형의 데이터 구조에서는 일반적으로 서로 기다릴 필요가없는 작업을 수행하는 동안 수십 개의 스레드가 모두 동시에 데이터 구조를 사용하려고하는 경우가 드문 경우입니다. 즉, 간단히 말해서 테스트 사례를 생성하여 스레드를 추가하고 모두 수행중인 작업을 적절하게 관리함으로써보다 적은 잠금 사례를 수행하는 것이 더 효과적 일 수 있습니다. 현재 테스트가 데이터 구조를 실제로 어떻게 사용할 것인지 계획을 세우는 것이 합리적이라면 사용법이보다 정교한 잠금 체계의 이점을 얻지 못하게 될 것입니다.

1

더 많이 동기화하면 애플리케이션 성능이 저하됩니다. 동기 루트를 사용하면 복잡한 상황에서 문제가 발생할 수 있습니다.

트릭은 동기화에서 올바른 균형을 찾는 것입니다. 경주가없는 등 믿을만한 제품입니다.

은 System.Collections.Concurrent 네임 스페이스

관련 문제