[c#] 동시 사전 올바른 사용법

이것이 동시 사전의 올바른 사용이라고 생각하는 것이 맞습니까?

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);
});


답변