c# 병렬 프로그래밍 예제
PLINQ에는 작업 분할이 수행되는 방식에 영향을 주는 많은 확장이 있습니다. 이 예제에서는 이러한 확장 중 하나에 대해 설명합니다. 아래 코드 검사: 병렬 For 또는 ForEach의 루프 본문이 대리자이므로 break 문을 사용하면 루프를 일찍 종료할 수 없습니다. 대신 병렬 루프 상태 개체에서 중단 또는 중지를 호출해야 합니다: 요소를 비교해야 하는 쿼리 연산자(GroupBy, Join, GroupJoin, 교차, 제외, 유니온 및 고유)의 경우 PLINQ는 항상 해시 분할을 사용합니다. 해시 분할은 모든 요소의 해시 코드를 미리 계산해야 하므로 동일한 해시 코드를 가진 요소를 동일한 스레드에서 처리할 수 있다는 점에서 상대적으로 비효율적입니다. 너무 느린 경우 유일한 옵션은 병렬화를 사용하지 않도록 As순차호출하는 것입니다. 예제 2에서는 다중 스레드 프로그래밍을 수행할 때 데이터 경합이 발생할 수 있다고 언급했습니다. 이 예제에서는 데이터 경합 시나리오와 이를 해결하는 방법을 보여 주며 이를 해결하는 방법을 보여 주며, 이를 해결하는 방법을 보여 주어 있습니다. 동시 백은 컬렉션의 병렬 연산이 대부분 요소 추가로 구성되거나 스레드에서 추가 및 테이크가 균형을 이루는 경우에 이상적입니다.
이전에 Parallel.ForEach를 사용하여 병렬 맞춤법 검사기를 구현할 때 전자의 예를 보았습니다. 우리의 캐치 블록을 우회하고 응용 프로그램이 죽는 원인이됩니다. 기존의 멀티스레딩 시나리오는 진정한 병렬화가 일어나지 않는 단일 코어 컴퓨터에서도 멀티스레딩이 도움이 될 수 있는 시나리오입니다. 이전에는 반응형 사용자 인터페이스를 유지하고 두 개의 웹 페이지를 한 번에 다운로드하는 등의 작업을 포함합니다. 과거에는 병렬화가 필요했습니다. Visual Studio 및 .NET Framework는 런타임, 클래스 라이브러리 유형 및 진단 도구를 제공하여 병렬 프로그래밍에 대한 지원을 향상시킵니다. .NET Framework 4와 함께 도입된 이러한 기능은 병렬 개발을 단순화합니다. 스레드 또는 스레드 풀에서 직접 작업할 필요 없이 효율적이고 세분화되고 확장 가능한 병렬 코드를 자연스러운 관용구로 작성할 수 있습니다. 스레드는 운영 체제가 CPU 시간을 할당하는 가장 작은 코드 단위입니다. 다중 스레딩에서 단일 프로세스에는 여러 스레드의 실행 스레드가 있습니다.
시스템에 CPU가 여러 개 있는 경우 병렬로 실행할 수 있습니다. Parallel.Invoke는 작업 대리자의 배열을 병렬로 실행한 다음 완료될 때까지 기다립니다. 메서드의 가장 간단한 버전은 다음과 같이 정의됩니다. (예를 들어, 1+2*2 != 2+1*1). 위의 코드는 PLINQ를 사용하여 지정된 범위의 모든 소수를 인쇄하는 데 2, 3 및 4의 제곱을 합산하는 데 사용할 때 어떤 일이 발생하는지 살펴보겠습니다. 병렬 코드 자체에 대 한 특별 한 아무것도, IsPrime 함수는 의도적으로 그 안에 던져 논리적 오류가 있다는 것을 제외 하 고: 프로그램을 실행 하는 경우 숫자 9, 15, 그리고 25 숫자로 보고 됩니다., 잘못 된. 이제 IsPrime 함수를 디버깅하고 그 안에 중단점을 설정하려고 합니다. 프로그램을 실행하면 여러 스레드가 실행중이므로 스레드가 중단점에 부딪히면서 포커스가 한 스레드에서 다른 스레드로 전환되므로 디버깅 동작이 불분명합니다. 이 예제에서는 일반 작업 팩터리를 가져오고 있음을 명확히 하기 위해 Task.Factory 호출에 형식 인수를 포함시켰습니다.
그러나 형식 인수는 컴파일러에서 유추하므로 필요하지 않습니다.