문제

나는 새로운 C# Parallel.ForEach, 다.순서는 일반적이다.내가 원하는 병렬화하는 검색을 포함한 수천명의 위치입니다.을 위해 각 위치,내가 계산한 원리합니다.는 계산이 나는 원하는 퍼지는 다른 코어 있습니다.나의 질문은 어떻게 이렇게 만약 내가 실 지역 변수,에서 이 MSDN TPL 예?에 대한 결과,보았 Interlocked, 고,해당 옵션 Add, CompareExchange, Decrement, Exchange, IncrementRead, 하지만 난 그냥의 추가,증가,감소시키거나 대한 테스트가 있습니다.나는 개체를 통해 여러 스레드를 병렬로 실행되는 최단 전체 거리입니다.내 창자가 말이 쉬워야 한다는 내가 있어야 만들 수 있는 몇 가지 작은 개체는 래핑 Location 거리지만,나는 어떻게 캡쳐 최고의 대답에서 각 스레드 다음 선택하는 가장 짧은 거리 그 중?여기에는 비 병렬 버전:

Location findClosestLocation(Location myLocation, List<Location> allLocations)
{
  double closest = double.MaxValue;
  Location closestLoc = null;
  foreach (Location aLoc in allLocations)
  {
    if (aLoc != myLocation)
    {
      double d = greatCircle(myLocation, aLoc);
      if (d < closest)
      {
        closest = d;
        closestLoc = aLoc;
      }
    }
  }
  return closestLoc;
}

가 블로그 포스팅 는 듯 제공하는 좋은 조언을지 궁금해했다면 그것이 최선의 조언입니다.나는 저자는 반복을 통해 배열과 경이 없는 경우에는 더 많은 기능적인 방법을 찾았습니다.에 기능적인 세계가 사용하는 것 map, lambdamin.

도움이 되었습니까?

해결책

가장 쉬운 옵션이 여기 것을 전환하 PLINQ:

Location findClosestLocation(Location myLocation, List<Location> allLocations)
{
     return allLocations
               .AsParallel()
               .Min(location => greatCircle(myLocation, location));
}

그는 말했다,이것은 기본적으로만 집으로 병렬 구조.당신은 몇 가지 옵션을 선택할 수 있습니다려는 경우 지팡이를 병행 클래스입니다.하는 것도 한 가지 방법이 될 수 있기에 내 자신을 사용하여 블록 잠글 수 있습니다.이 없으로,그 상처 당신의 전반적인 성능을 개선합니다.

더 나은 옵션을 사용하는 것입 병행합니다.ForEach 는 방법을 제공을 위한 현지 상태가 됩니다.에 당신을 다시 이 같:

Location findClosestLocation(Location myLocation, List<Location> allLocations)
{
  double closest = double.MaxValue;
  Location closestLoc = null;
  object sync = new object();

  Parallel.ForEach<Location, Tuple<double,Location>(
      allLocations,
      () => new Tuple(double.MaxValue, null),
      (location, loopState, localState) =>
      {
          double d = greatCircle(myLocation, aLoc);
          if (d < localState.Item1)
              return new Tuple(d, aLoc);
          else
              return localState;
      },
      localState =>
      {
          lock(sync)
          {
              if (localState.Item1 < closest)
              {
                  closest = localState.Item1;
                  closestLoc = localState.Item2;
              }
          }
      }
  );
  return closestLoc;
}

내가 사용하여 커버 현지 상태에 대한 집계에 대한 세부 사항 나 블로그.이것은 기본적으로 변화 작업을 하는 잠금 작업을 당신의 하나 잠금 당 처리 요소,그래서 당신은 훨씬 더 높은 처리량보다는 순진한 잠그는 솔루션입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top