요소 추가, 읽기 및 제거와 관련하여 C# 사전이 스레드로부터 안전하지 않다는 것을 알고 있습니다. 그러나 다른 스레드가 사전에 쓰고, 읽고, 제거하는 경우 C# 사전의 Count 속성에 스레드로부터 안전하게 액세스 할 수 있습니까?C# 사전에 대한 다중 스레드 액세스
답변
사전을 정적 읽기 전용 개체로 만들 수 있으며 수정시 lock
을 사용하면 대부분의 문제를 해결해야합니다.
속성은 두포 후드에서의 메소드 호출이므로 실제 상황은 언뜻보기에 그렇게 간단하지 않습니다.
- T1 : 액세스 Count 속성
- T1 : get_Count() 호출 (JMP/GOTO ASM 명령의 일종)
- T1 : 변수 읽기 항목 == 1
- T2의 수를 나타낸다 : 새 항목을 addign, 실제 수는 2
- T1이된다 : 1을 반환하지만 정말 두 항목
이미 거기를 따라서 응용 프로그램의 로직은에 의존하는 경우속성 값 - 이론적으로는 race condition으로 끝날 수 있습니다.
그것은 파열되지 않을 것이라는 점에서 스레드 안전해야하지만, 사전을 조작하는 다른 스레드로 인해 정확한 카운트를주지 못할 수도 있다는 점에서 스레드 안전하지 않다는 것이 확실합니다.
[편집 : usr가이 레벨에서 현재 스레드 안전성을 갖고 있다고해서 그것이 계속 될 것임을 의미하지는 않습니다. 당신은 보장이 없습니다]
달성하려는 것에 따라 ReaderWriterLockSlim으로 사전을 보호 할 수 있습니다. 이렇게하면 돌연변이 연산을 수행 할 때 사전 읽기 속도를 높이고 사전을 잠글 수 있습니다.
오히려 가정보다 내가 가서 반사에 그것을보고 :
public int Count
{
get
{
// count and freeCount are local fields
return (this.count - this.freeCount);
}
}
는 그래서 그래, 그것은 사전 객체 그것이 액세스하는 경우가 발생하지 않습니다 부패 "스레드로부터 안전합니다"입니다. 즉, 사전에 다른 스레드가 액세스하는 경우 어떤 정확도로 카운트를 얻는 것이 중요한 경우에 대해 생각할 수 있는지 확신 할 수 없습니다.
'if (dict.Count == 1)'은 절대로 안전하게 작동하지 않을 것이다. –
@L.B : 대답 끝에서 단락을 읽었습니까? –
전체 답변을 읽지 않고 의견을 쓰신 것 같습니까? 사전이 다른 스레드에 의해 액세스되는 경우 어떤 정확도로 카운트를 얻는 것이 중요한 경우를 생각해 볼 수 있습니다.'당신의 상상력으로는 정확하지만 제한적입니다. –
처음 : 이것은 위험한 생각입니다. 그런 것을 생산에 넣으면 매우 조심하십시오. 아마도 자물쇠 나 ConcurrentDictionary 만 사용해야 할 것입니다.
대략적인 답변을 원하십니까?
그러나 Reflector는 카운트가 일부 필드를 읽고 반환한다는 것을 보여줍니다. 이것은 영원히 바뀌지 않을 것입니다. 따라서 합리적으로 위험을 감수 할 수 있습니다.
- 1. 다중 스레드 환경에서 .NET 사전에 액세스
- 2. Python bytearray에 대한 다중 스레드 액세스
- 3. 다중 스레드 액세스 배열
- 4. 양식에 대한 BackgroundWorker 다중 스레드 액세스
- 5. ADO.Net을 사용하여 MySQL에 대한 다중 스레드 액세스
- 6. C#에서 WPF GUI에 대한 다중 스레드 액세스
- 7. 다중 스레드 변수 액세스
- 8. 메모리에 다중 스레드 액세스
- 9. C++ 다중 스레드 창 GUI (양식 액세스)
- 10. 다중 스레드 데이터베이스 읽기 액세스
- 11. Java 다중 스레드 데이터베이스 액세스
- 12. Delphi에서 컴포넌트의 다중 스레드 액세스
- 13. HEAP_NO_SERIALIZE 힙의 다중 스레드 액세스
- 14. 다중 스레드 버퍼 C++
- 15. C 다중 스레드 교착 상태 스레드 이벤트
- 16. x 스레드 수에 대한 다중 스레드 예제
- 17. C# - 대기열 및 다중 스레드
- 18. C++ - 스레드 및 다중 대기열
- 19. 다중 스레드 파일 액세스 (잠금 제어)
- 20. C# 다중 스레드 개념 질문
- 21. 벡터에 대한 다중 스레드, 읽기 전용 액세스. 복사 또는 잠그시겠습니까?
- 22. Java - 주기적으로 지워지는 로컬 값 저장소에 대한 다중 스레드 액세스
- 23. 다중 스레드 서버 응용 프로그램에서 SQL DB에 대한 액세스
- 24. 다중 스레드 Tomcat 서버에서 전역 변수에 액세스
- 25. RSS 리더 다중 스레드 C#
- 26. C++ 다중 스레드 서버 도움말
- 27. 다중 스레드 C# 응용 프로그램
- 28. C#의 다중 스레드 직렬화
- 29. C# Winform 다중 스레드 시퀀스
- 30. 다중 포트를위한 다중 스레드?
올바른 값을 반환 할 것으로 기대합니까? –
또는 ConcurrentDictionary를 사용하십시오 ... http://msdn.microsoft.com/en-us/library/dd287191.aspx –