이것이 동시 사전의 올바른 사용이라고 생각하는 것이 맞습니까?
private ConcurrentDictionary<int,long> myDic = new ConcurrentDictionary<int,long>();
//Main thread at program startup
for(int i = 0; i < 4; i++)
{
myDic.Add(i, 0);
}
//Seperate threads use this to update a value
myDic[InputID] = newLongValue;
잠금 등이 없으며 여러 스레드가 동일한 작업을 시도하더라도 사전의 값을 업데이트하고 있습니다.
답변
스레드 안전성이 의미하는 바에 따라 다릅니다.
MSDN에서- 방법 : ConcurrentDictionary에서 항목 추가 및 제거 :
ConcurrentDictionary<TKey, TValue>
다중 스레드 시나리오를 위해 설계되었습니다. 컬렉션에서 항목을 추가하거나 제거하기 위해 코드에서 잠금을 사용할 필요가 없습니다. 그러나 한 스레드는 항상 값을 검색하고 다른 스레드는 동일한 키에 새 값을 제공하여 컬렉션을 즉시 업데이트 할 수 있습니다.
따라서 사전에있는 항목의 값에 대한 일관성없는 보기 를 얻을 수 있습니다 .
답변
이것을 찾는 가장 좋은 방법은 MSDN 문서를 확인하는 것입니다.
ConcurrentDictionary의 경우 페이지는 http://msdn.microsoft.com/en-us/library/dd287191.aspx 입니다 .
스레드 안전 섹션에는 “ConcurrentDictionary (Of TKey, TValue)의 모든 공용 및 보호 멤버는 스레드로부터 안전하며 여러 스레드에서 동시에 사용할 수 있습니다.”라고 명시되어 있습니다.
따라서 동시성 관점에서 보면 괜찮습니다.
답변
그래 네가 맞아.
그것과 한 스레드에서 사전을 열거하고 다른 스레드에서 변경하는 가능성은 해당 클래스의 유일한 존재 수단입니다.
답변
제 경우에는이 방법을 선호합니다.
ConcurrentDictionary<TKey, TValue>.AddOrUpdate Method (TKey, Func<TKey, TValue>, Func<TKey, TValue, TValue>);
메서드 사용에 대한 자세한 내용은 MSDN Library 를 참조 하십시오.
샘플 사용법 :
results.AddOrUpdate(
Id,
id => new DbResult() {
Id = id,
Value = row.Value,
Rank = 1
},
(id, v) =>
{
v.Rank++;
return v;
});
답변
참고 사항 : 선형 루프가 있는 ConcurrentDicitonary 객체를 사용하는 것을 정당화하지 않아 활용도가 떨어집니다. 가장 좋은 대안은 아래 예제에 따라 Oded가 Parallelism을 사용하여 언급 한대로 Microsoft 설명서의 권장 사항을 따르는 것입니다 .
Parallel.For(0, 4, i =>
{
myDic.TryAdd(i, 0);
});