2012-03-30 4 views
2

요소 추가, 읽기 및 제거와 관련하여 C# 사전이 스레드로부터 안전하지 않다는 것을 알고 있습니다. 그러나 다른 스레드가 사전에 쓰고, 읽고, 제거하는 경우 C# 사전의 Count 속성에 스레드로부터 안전하게 액세스 할 수 있습니까?C# 사전에 대한 다중 스레드 액세스

+2

올바른 값을 반환 할 것으로 기대합니까? –

+0

또는 ConcurrentDictionary를 사용하십시오 ... http://msdn.microsoft.com/en-us/library/dd287191.aspx –

답변

0

사전을 정적 읽기 전용 개체로 만들 수 있으며 수정시 lock을 사용하면 대부분의 문제를 해결해야합니다.

2

속성은 두포 후드에서의 메소드 호출이므로 실제 상황은 언뜻보기에 그렇게 간단하지 않습니다.

  • T1 : 액세스 Count 속성
  • T1 : get_Count() 호출 (JMP/GOTO ASM 명령의 일종)
  • T1 : 변수 읽기 항목 == 1
  • T2의 수를 나타낸다 : 새 항목을 addign, 실제 수는 2
  • T1이된다 : 1을 반환하지만 정말 두 항목

이미 거기를 따라서 응용 프로그램의 로직은에 의존하는 경우속성 값 - 이론적으로는 race condition으로 끝날 수 있습니다.

+0

속성을 직접 쓸 수 없기 때문에 속성을 동시에 읽을 수 없습니다. 후자는 전자를 따르지 않습니다. 이것은 위험한 생각입니다. – usr

+0

맞다. 내 대답을 쓰는 중이다. 처음에는 내 생각이 틀렸다. 맞다. – sll

4

그것은 파열되지 않을 것이라는 점에서 스레드 안전해야하지만, 사전을 조작하는 다른 스레드로 인해 정확한 카운트를주지 못할 수도 있다는 점에서 스레드 안전하지 않다는 것이 확실합니다.

[편집 : usr가이 레벨에서 현재 스레드 안전성을 갖고 있다고해서 그것이 계속 될 것임을 의미하지는 않습니다. 당신은 보장이 없습니다]

0

달성하려는 것에 따라 ReaderWriterLockSlim으로 사전을 보호 할 수 있습니다. 이렇게하면 돌연변이 연산을 수행 할 때 사전 읽기 속도를 높이고 사전을 잠글 수 있습니다.

0

오히려 가정보다 내가 가서 반사에 그것을보고 :

public int Count 
{ 
    get 
    { 
     // count and freeCount are local fields 
     return (this.count - this.freeCount); 
    } 
} 

는 그래서 그래, 그것은 사전 객체 그것이 액세스하는 경우가 발생하지 않습니다 부패 "스레드로부터 안전합니다"입니다. 즉, 사전에 다른 스레드가 액세스하는 경우 어떤 정확도로 카운트를 얻는 것이 중요한 경우에 대해 생각할 수 있는지 확신 할 수 없습니다.

+0

'if (dict.Count == 1)'은 절대로 안전하게 작동하지 않을 것이다. –

+0

@L.B : 대답 끝에서 단락을 읽었습니까? –

+0

전체 답변을 읽지 않고 의견을 쓰신 것 같습니까? 사전이 다른 스레드에 의해 액세스되는 경우 어떤 정확도로 카운트를 얻는 것이 중요한 경우를 생각해 볼 수 있습니다.'당신의 상상력으로는 정확하지만 제한적입니다. –

1

처음 : 이것은 위험한 생각입니다. 그런 것을 생산에 넣으면 매우 조심하십시오. 아마도 자물쇠 나 ConcurrentDictionary 만 사용해야 할 것입니다.

대략적인 답변을 원하십니까?

그러나 Reflector는 카운트가 일부 필드를 읽고 반환한다는 것을 보여줍니다. 이것은 영원히 바뀌지 않을 것입니다. 따라서 합리적으로 위험을 감수 할 수 있습니다.

관련 문제