2017-11-09 11 views
-2

다중 스레드 환경에서 동시 사전 dict<string, list<CustomObjects>>을 사용하고 있습니다.여러 스레드가 동시 사전에서 다른 요소를 동시에 액세스하고 수정하는 중

여러 스레드가 고유 한 키로 항목을 검색하고 수정하기 위해 동일한 사전에 액세스하고 있습니다. 각 스레드가 액세스하고 고유 한 키에서만 요소를 수정하는 사전에 액세스하는 다중 스레드가 있음에도 불구하고 말합니다.

언제든지 둘 이상의 스레드가 동일한 키 위치에서 요소에 액세스하고 수정하려고하는 상황이 발생하지 않습니다.

지금 내 질문에이 경우에도 내부 잠금이 발생합니까? 또는 다른 스레드가 동일한 사전에 다른 요소를 동시에 액세스하고 있으므로 내부 잠금 또는 동시성 메커니즘이 실행되지 않습니다.

하나 이상의 스레드가 동일한 키 위치에서 요소를 수정하려고하면 기본적으로 잠금이 실행되고 동시성이 보장됩니다. 그러나 다른 스레드가 사전 내의 다른 항목에 액세스하는 경우 내부적으로 잠금없이 수행됩니까?

+0

"동시 사전"이라고 할 때,'ConcurrentDictionary '를 의미합니까? 그렇다면이 유형이 내부적으로 어떻게 구현되는지에 대한 질문입니까? 나는 평행 업데이트가 안전하다는 보장을 넘어 실제 구현 세부 사항을 보장하지 않으므로 형식이 명시 적 잠금없이이 보증을 관리 할 수 ​​있다면 ... ** 정확히 당신의 질문은 무엇입니까? ** –

+1

[ 클래스 설명서의 비고 부분] (https://msdn.microsoft.com/en-us/library/dd287191(v=vs.110).aspx # 설명) 사전에 대한 수정 및 쓰기 작업의 경우 ConcurrentDictionary 는 세밀한 잠금을 사용하여 스레드 안전을 보장합니다. (사전 읽기 작업은 잠금이 해제 된 방식으로 수행됩니다.) ' –

+0

문서 읽기 ........... –

답변

-4

키 값은 잠금 설정 여부에 영향을주지 않습니다. ConcurrentDictionary<,>은 기본적으로 쓰기 작업 주위에 잠금이있는 Dictionary<,>의 래퍼입니다.

편집 : 수정되었습니다. 내부 동작은 내가 생각한 것처럼 간단하지 않습니다.) 큰 소리로 말하기 전에 매뉴얼을 참고해야했다.)

+2

[ConcurrentDictionary] (https://msdn.microsoft.com/en-us/library/dd287191(v=vs.110) .aspx)는 동시 수정을 허용하도록 특별히 작성된 사전입니다. 안전해야하는 것은 * 열쇠 *가 아닙니다. 그것은 사전 자체입니다 –

+0

사실, 아마도 내 대답은 분명하지 않았습니다. 내가 말하고자하는 것은 키가 중요하지 않다는 것입니다. 사전은 여전히 ​​스레드 안전을 위해 잠금을 사용합니다. –

+0

"사전에 대한 읽기 작업은 ** 잠금없는 ** 방식으로 수행됩니다." – Fildor