저는 C#, Parallel.ForEach
및 .NET에 익숙하지 않습니다. 수천 개의 위치가 포함 된 검색을 병렬 처리하고 싶습니다. 각 위치에 대해 큰 원 거리를 계산합니다. 그것은 다른 코어로 퍼지기를 원하는 계산입니다. 내 질문은이 MSDN TPL example 같이 하나만 스레드 로컬 변수가있는 경우 어떻게합니까? 그 결과, 나는 Interlocked
을보고, 옵션이 Add
, CompareExchange
, Decrement
, Exchange
, Increment
및 Read
인 것을 보았습니다. 그러나 저는 단지 추가, 증가, 감소 또는 동등성을 테스트하는 것이 아닙니다. 병렬로 실행되는 여러 스레드에서 객체를 반환하려는 경우 거리가 가장 짧습니다. 내 직감이 쉽게해야한다, 내가 Location
및 거리를 래핑하는 몇 가지 작은 개체를 만들 수 있어야하지만 어떻게 각 스레드에서 최상의 답변을 캡처합니까 다음 그들 사이의 최단 거리를 선택? 다음은 비 병렬 버전 :Parallel.ForEach를 사용하여 최소값 중에서 최소값 선택하기
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;
}
내가 좋은 조언을 제공 듯 DDJ Blog Post를 참조했지만 나는 그것이 최선의 충고했다 궁금. 필자는 배열을 반복하는 루핑을 보았습니다.이 작업을 수행하는 데 더 기능적인 방법이 없는지 궁금합니다. 기능적 세계에서 나는 map
, lambda
및 min
을 사용할 것입니다.
와우, 그것이 짧고 달콤합니다. 그것은 내 기능적인 마음을 노래하게합니다. 감사! – gknauth
@ gknauth : 예 - 올바른/성능있는 Parallel.ForEach 옵션도 추가했습니다. 나는 ** 다른 옵션이 어떻게 작동 하는지를 배우고 그것을 이해하려고 노력하는 것을 추천한다. 하지만 이러한 작업의 대부분은 PLINQ를 사용하기 때문에 가치가 있습니다. –
블로그에 나를 단서 주셔서 감사합니다. 멋지군요. 책을 쓰면, 내가 살 것이다! 또는 그것이 너무 많은 일이라면, 나는 당신에게 저녁을 사줄 것입니다. – gknauth