2012-04-21 2 views
4

스레드 안전성 측면에서 HashTable과 사전간에 차이가 있습니까? 다음과 같이 나는 어떤 ... MSDN에 따르면, 모두가 정의되어 표시되지 않습니다 : -사전과 해시 테이블 간의 차이점 스레드 안전성

Hashtable

의 Hashtable 여러 판독기 스레드와 하나의 쓰기 스레드로 안전하게 사용할 수 스레드입니다. 스레드 중 하나만 쓰기 (업데이트) 작업을 수행 할 때은 Hashtable 으로 직렬화되면 lock-free 읽기가 허용되는 멀티 스레드 스레드에서는 스레드 안전성을 보장합니다.

Dictionary

사전은 다수의 독자를 지원할 수는 동시에, 는 한 컬렉션이 수정되지 않는. 그렇더라도 컬렉션을 통해 을 열거하는 것은 본질적으로 스레드로부터 안전한 프로 시저가 아닙니다. 열거 형이 쓰기 액세스와 경합하는 드문 경우이지만 전체 열거 중에 컬렉션을 잠 가야합니다. 읽기 및 쓰기를 위해 컬렉션에 여러 스레드에서 액세스 할 수있게하려면 자신의 동기화를 구현해야합니다.

+3

HashTable = 일반이 아니므로 사용하지 마십시오. 이제까지. 지원되지 않습니다. –

+0

@KonradRudolph, 그것은 더 이상 사용되지 않지만 IMO는 ...이어야합니다. –

+0

@Thomas 정확히. 나는 그렇게 선언한다. 나는 마이크로 소프트가 아직도이 수업에서 플러그를 뽑지 않은 이유를 모르지만 정중 한 회사에서는 사용하지 않는다. –

답변

8

두 클래스 모두 잠금없이 한 번에 여러 독자를 허용하므로 둘 다 여러 작성자에 대해 잠겨 있어야합니다. 차이점은 Hashtable은 사전 판독기로는 안전하지 않지만 잠금 기능없이 여러 독자와 함께 한 작가를 허용한다는 것입니다. 따라서 Hashtable의 경우에만 쓰기를 잠 가야합니다. 키와 값이 모두 참조 유형이므로 boxing/unboxing이 필요하지 않은 경우 Hashtable은 많은 독자와 한 명 이상의 작성자가있는 시나리오에서 Dictionary보다 빠를 수 있습니다. 독자는 자물쇠를 기다릴 필요가 없으므로 모든. 사전을 사용하면 동일한 시나리오에서 ReaderWriterLock을 사용해야합니다.