2014-07-08 2 views
1

I 다음 TPL 기능 가지고병렬 증분 제어 변수

int arrayIndex = 0; 

Dictionary < string, int > customModel = new Dictionary < string, int >(); 

    Task task = Task.Factory.StartNew(() => 

     // process each employee holiday 

     Parallel.ForEach <EmployeeHolidaysModel> (holidays, 
      new ParallelOptions() { 
       MaxDegreeOfParallelism = System.Enviroment.ProcessorCount 
      }, 
      item => { 

       customModel.Add(item.HolidayName, arrayIndex); 

       // increment the index 
       arrayIndex++; 

      }) 
    ); 

    //wait for all Tasks to finish 
    Task.WaitAll(task); 

문제는 arrayIndex 때문에 평행도의 고유 값이 없을 것입니다.

arrayIndex 변수를 제어 할 수있는 방법이있어 병렬 작업간에 고유 한 값이 있습니까?

기본적으로 내 customModel에는 중복 값 arrayIndex 값을 가질 수 없습니다.

감사합니다. 여기

+0

첫째 : 왜 당신이 병렬로이 작업을 수행 하시겠습니까? 평행주의에 실제로 도움이되는 충분한 휴일이 있습니까? 작은 데이터 세트의 경우, 다중 스레드 사용의 오버 헤드는 작업을 병렬화함으로써 얻을 수있는 이점보다 훨씬 큽니다. –

+0

샘플을 배치하기 만하지만 많은 계산이 있고 데이터를 가져 오는 데 약 8 초가 걸립니다. 그게 더 빠를 필요가 있습니다. – VAAA

+1

customModel 객체가 사전이되어야합니까? 객체가 대신 색인을 추적하도록하는 것이 낫지 않습니까? 그것은 단지 열쇠와 가치있는 색인으로 문자열을 가지고 이상하게 보입니다,하지만 아마도 당신은 그것을 정교하게 설명 할 수 있습니다. –

답변

2

세 가지 문제 :

  1. 당신은 공유 변수합니다 (INT와 사전 모두)에 기록되어있다. 이것은 안전하지 않습니다. 동기화하거나 스레드 안전 컬렉션을 사용해야합니다.
  2. 반복 작업 당 수행하는 작업량이 너무 적어서 병렬 처리의 오버 헤드가 몇 배 더 커집니다. 이것은 병렬 처리에 좋은 사례는 아닙니다. 주요 경기 침체가 예상됩니다.
  3. 작업을 시작한 다음 기다립니다. 그 일을 성취하기 위해 당신은 무엇을 의미 했습니까?

기본으로 tutorial about threading이 필요하다고 생각합니다. 이들은 매우 기본적인 문제입니다. 현재 지식 수준에서 멀티 스레딩을 사용하여 재미를 느끼지 못할 것입니다 ...

1

Interlocked.Increment()을 사용해야합니다. 또한 질문을 위해 조리 한 샘플 코드가 아니라고 가정하면 안전을 위해 ConcurrentDictionary을 사용해야합니다.

마찬가지로 작업은 여기에 필요하지 않습니다. 그냥 완료하기를 기다리고 있기 때문에 customModel입니다. 분명히 시나리오가 더 복잡 할 수 있습니다.

하지만 게시 된 코드는, 내가 좋아하는 뭔가를 할 거라고 주어진 :

int arrayIndex = 0; 

ConcurrentDictionary<string,int> customModel 
     = new ConcurrentDictionary<string,int>(); 

Parallel.ForEach<EmployeeHolidaysModel>(
    holidays, 
    new ParallelOptions() { 
     MaxDegreeOfParallelism = System.Enviroment.ProcessorCount 
    }, 
    item => customModel.TryAdd(
     item.HolidayName, 
     Interlocked.Increment(ref arrayIndex) 
    ) 
); 

NowYouCanDoSomethingWith(customModel);