2011-02-09 2 views
3

다음과 같이 정의 된 네 가지 수준의 데이터 구조가 있습니다.다중 레벨 ConcurrentDictionary는 여전히 스레드로부터 안전한가요?

Dictionary<Type1, Dictionary<Type2, Dictionary<Type3, List<Type4>>>> 

모든 것은 스레드 안전성을 유지하는 클래스로 캡슐화됩니다. 현재는 데이터를 읽거나 조작하는 동안 전체 컬렉션을 잠급니다 (읽기는 글쓰기보다 일반적인 순서대로 이루어집니다).

DictionaryConcurrentDictionary로 교체하고 ListConcurrentBag (해당 항목을 주문할 필요가 없음)로 교체하려고 생각했습니다.

이렇게하면 잠금을 제거하고 동시 수집이 작업을 올바르게 수행 할 수 있습니까?

+1

동시 수집 *은 작업을 올바르게 수행하지만 데이터 구조가 미친 것처럼 보입니다! – LukeH

+0

'ConcurrentDictionary , TValue>'을 원하지 않습니까? – CodesInChaos

+0

@CodeInChaos Mania의 답변에 대한 내 의견보기. –

답변

3

동시 수집을 사용하면 데이터 손상 및 충돌을 방지 할 수 있지만 코드는 현재의 의미와 의미가 동일하지 않습니다. 당신이 동시 사전 중 하나 some of the items may belong to different updates 반복 예를 들어, : 그러나 그것은 이 순간을 표현하지 않는, 열거 자이 사전에서 반환

읽기와 동시에 를 사용하는 것이 안전하고 사전에 기록 -의 사전 - 시간 스냅 샷. 열거자를 통해 에 노출 된 내용은 GetEnumerator가 호출 된 후 사전에 대한 수정 내용을 포함 할 수 있습니다. 당신이 지금 가지고있는 정확한 동작을 유지하면서도 잠금의 비용을 저장하려면

, 당신은 더 쓰기보다 읽기와 경우에 특히 적합하다 ReaderWriterLockSlim로 고정 할 수 있습니다.

+0

'ReaderWriterLockSlim'은 상대적으로 큰 오버 헤드를 가지고 있다고 생각합니다. 따라서 대부분의 빠른 작업을 위해 최적의 상태가 아닐 수도 있습니다. – CodesInChaos

6

내가 거의 일년 늦게 질문 해요 ..하지만 단지의 경우 사람이 마테이 Zábský 유사한 위치에 자신을 발견, 자신에게 물어 :

당신은 Dictionary<Tuple<Type1, Type2, Type3>, List<Type4>> 대신 사용할 수 있습니까?

해시 테이블 (예 : 사전)은 다소 무거운 일정한 구성 요소가있는 O (1) 데이터 구조 (심지어 ConcurrentDictionary로 이동하면 훨씬 더 빠르게 수행 할 수 있음)를 고려하면 훨씬 쉽습니다. . 또한 메모리를 덜 사용하고 ConcurrentDictionary으로 변환하는 것도 아주 간단합니다.

물론 주어진 Type1 키에 대해 주어진 Type2을 모두 열거해야한다면 중첩 된 사전이 가능할 수 있습니다. 그러나 그것이 요구 사항입니까?

+2

터플 키가 포함 된 사전이 중첩 된 사전보다 좋음에 동의하지만 내 솔루션의 중첩 된 특성이 유용하다는 것을 알았습니다 (O 키 (N) 대신 O 사전 키를 사용하여 모든 항목을 제거 할 수있었습니다.), 하나의 L2 사전을 제거하여 L1과 L2 키 조합이있는 모든 항목 ...). 그러나 이것은 종종 사실이 아닐 수도 있습니다. +1 –

관련 문제