2012-01-09 6 views
4

을 사용하여 목록에 추가 할 때 스레드 안전성을 보장하는 올바른 방법 연결 문자열 배열을 반복하고 각 루프에서 일부 정보를 추출하고 목록에 추가합니다. 지금, 나는 그것이 멀티 스레드 수 있도록 병렬 라이브러리를 사용하기를 원하지만 목록에 기록하는 라이브러리 보장 내가 잠금의 사용 여부 스레드 안전 또는 것입니다 있는지 확실하지 않습니다 :병렬 라이브러리

List<SomeType> list = new List<SomeType>(); 

settings.AsParallel().ForAll(setting => 
{ 
    list.AddRange(GetSomeArrayofSomeType(setting)); /// DO I NEED TO DO LOCKING HERE??? 
}) 
+0

왜 처음부터 이러한 복잡성을 피하고'list'에 추가 할 설정을 미리 선택해야합니까? –

+0

목록에 설정을 추가하지 않고 설정별로 배열을 검색하고 해당 배열의 내용을 주 목록에 추가합니다. 검색 프로세스가 오래 걸릴 수 있으므로 멀티 스레드가 필요합니다. – Andrey

답변

10

쓰기의에를 목록은 실제로 다중 스레드 쓰기에 안전하지 않습니다. 액세스를 동기화하려면 lock을 사용하거나 다중 스레드 액세스 용으로 설계된 ConcurrentQueue과 같은 콜렉션을 사용해야합니다.

잠금 예 (list 가정에있어서의 로컬)

List<SomeType> list = new List<SomeType>(); 
settings.AsParallel().ForAll(setting => { 
    lock (list) { 
    list.AddRange(GetSomeArrayofSomeType(setting)); 
    } 
}); 

아니면 더 좋은 대신 ForEach

var list = settings 
    .AsParallel() 
    .SelectMany(setting => GetSomeArrayOfSomeType(setting)) 
    .ToList(); 
C 중 #
+1

+1 SelectMany – dtb

+0

감사합니다. – Andrey

+1

각 작업을 자체 목록에 쓰고 (각 목록을 보는 스레드가 하나뿐이므로 안전) 작업을 마친 후 최종 단계에서 모두 결합 할 수 있습니다. 첫 번째 추가 작업에 필요한 동기화가 없기 때문에이 작업을 수행 할 수 있습니다. –

관련 문제