2011-09-19 6 views
-1

.Net List 클래스는 스레드로부터 안전하지 않습니다. 필자는 최소한의 자물쇠가 필요하지만 여전히 읽기, 팬텀 레코드가 허용되고 쓰는 것에 대한 요구 사항을 충족 시키려면 스레드로부터 안전해야하므로 손실 된 업데이트가 없도록해야합니다..NET List 스레드 안전 구현 제안이 필요합니다

그래서 나는

public static List<string> list = new List<string>(); 

In Methods that have **List.Add**/**List.Remove** , I always lock to assure thread safety 

      lock (lockHelper) 
      { 
        list.Add(obj); 
        or list.Remove(obj); 
      } 

In Methods that requires **List Reading** I don't care about phantom record so I go ahead to read without any locking. In this case. Return a bool by checking whether a string had been added. 

      if (list.Count() != 0) { 
       return list.Contains("some string") 
      } 

내가 쓰기 잠금 된 한 모든 액세스 같은 것을 가지고 있고, 어떤 잠금없이 통과에 대한 액세스를 읽을 수 있습니다. 내 스레드 안전 아이디어가 유효합니까?

목록 크기 확장이 있다는 것을 알고 있습니다. 괜찮을까요? 내 생각 엔 List가 확장되면 temp를 사용할 수 있습니다. 명부. 임시 목록 크기가 항상 경계를 가지며 .Net 클래스가 잘 구현되어 있기 때문에 괜찮습니다. 읽은 내용이 업데이트에서 발견되면 indexOutOfBound 또는 순환 참조 문제가 없어야합니다.

+1

사용하는 .NET 버전의 모든 스레드 안전 컬렉션을 볼 수 있습니까? – msarchet

+0

microsoft.net v4.0 – Bamboo

답변

3

아니요 안전하지 않습니다. 읽기 및 열거로부터 보호해야합니다.

4.0을 사용하고 있으므로 새 스레드 안전 컬렉션을 확인하십시오.

http://msdn.microsoft.com/en-us/library/dd997305.aspx

+0

내 자신의 impl을 사용하는 경우. (목록이 수정되었을 때 예외를 throw하는) .net에서 제공하는 것 대신 열거 형을 사용하는 것이 좋습니다. http://refactormycode.com/codes/945-cached-ienumerable-t 이제 스레드로부터 안전합니까? – Bamboo

+1

그것의 많은 여분의 작품, 특히 이후. NET은 지금 당신에게 이것을 제공합니다. –

1

당신은 .NET 프레임 워크 4를 사용하는 경우; ConcurrentBag<T>을 사용하지 않으시겠습니까?

1

.NET 4.0을 사용하고 있으므로 UnorderedList의 스레드 안전 구현으로 제공되는대로 ConcurrentBag<T>을 사용해야합니다.

는 현재

.NET Thread Safe Collections