병렬 프로그래밍을 위한 데이터 구조
.NET에서는 동시 컬렉션 클래스, 간단한 동기화 기본 요소 및 초기화 지연 관련 형식을 포함하여 병렬 프로그래밍에서 유용한 여러 가지 형식을 소개합니다. 이러한 형식을 작업 병렬 라이브러리 및 PLINQ를 포함한 다중 스레드 애플리케이션 코드와 함께 사용할 수 있습니다.
동시 컬렉션 클래스
System.Collections.Concurrent 네임스페이스의 컬렉션 클래스는 가능한 경우 항상 잠금을 방지하고 잠금이 필요한 경우 세분화된 잠금을 사용하는 스레드로부터 안전한 추가 및 제거 작업을 제공합니다. 동시 컬렉션 클래스는 항목에 액세스할 때 사용자 코드가 잠금을 수행하도록 요구하지 않습니다. 동시 컬렉션 클래스는 여러 스레드가 컬렉션에서 항목을 추가하고 제거하는 시나리오에서 System.Collections.ArrayList 및 System.Collections.Generic.List<T>(사용자가 구현한 잠금 사용)와 같은 형식보다 성능을 크게 개선할 수 있습니다.
다음 표에는 동시 컬렉션 클래스가 나와 있습니다.
Type | 설명 |
---|---|
System.Collections.Concurrent.BlockingCollection<T> | System.Collections.Concurrent.IProducerConsumerCollection<T>을 구현하는 스레드로부터 안전한 컬렉션에 대한 차단 및 경계 기능을 제공합니다. 슬롯을 사용할 수 없거나 컬렉션이 가득 차면 생산자 스레드가 차단됩니다. 컬렉션이 비어 있으면 소비자 스레드가 차단됩니다. 이 형식은 소비자 및 생산자가 비차단 액세스도 지원합니다. BlockingCollection<T>은 IEnumerable<T>을 지원하는 모든 컬렉션 클래스에 대한 차단 및 결합을 제공하기 위한 기본 클래스 또는 백업 저장소로 사용할 수 있습니다. |
System.Collections.Concurrent.ConcurrentBag<T> | 확장 가능한 추가 및 가져오기 작업을 제공하는 스레드로부터 안전한 모음 구현. |
System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> | 동시 및 확장 가능한 사전 형식. |
System.Collections.Concurrent.ConcurrentQueue<T> | 동시 및 확장 가능한 FIFO 큐. |
System.Collections.Concurrent.ConcurrentStack<T> | 동시 및 확장 가능한 LIFO 스택. |
자세한 내용은 스레드로부터 안전한 컬렉션을 참조하세요.
동기화 기본 형식
System.Threading 네임스페이스의 동기화 기본 형식은 레거시 다중 스레딩 코드에 있는 비용이 많이 드는 잠금 메커니즘을 방지하여 세분화된 동시성과 더 빠른 성능을 제공할 수 있습니다.
다음 표에는 동기화 형식이 나와 있습니다.
Type | 설명 |
---|---|
System.Threading.Barrier | 각 작업이 도착에 대한 신호를 보낸 다음, 일부 또는 모든 작업이 도착할 때까지 차단될 수 있는 지점을 제공하여 여러 스레드가 하나의 알고리즘에서 병렬로 작동하도록 합니다. 자세한 내용은 Barrier를 참조하세요. |
System.Threading.CountdownEvent | 쉽게 랑데부 메커니즘을 제공하여 포크 및 조인 시나리오를 간소화합니다. 자세한 내용은 CountdownEvent를 참조하세요. |
System.Threading.ManualResetEventSlim | System.Threading.ManualResetEvent와 유사한 동기화 기본 형식입니다. ManualResetEventSlim은 더 간단하지만 프로세스 간 통신에만 사용할 수 있습니다. |
System.Threading.SemaphoreSlim | 리소스 또는 리소스 풀에 동시에 액세스할 수 있는 스레드 수를 제한하는 동기화 기본 형식입니다. 자세한 내용은 세마포 및 SemaphoreSlim을 참조하세요. |
System.Threading.SpinLock | 퀀텀을 일시 중단하기 전에 일정 시간 동안 잠금을 획득하려고 시도 중인 스레드가 루프 또는 ‘스핀’에서 대기하도록 하는 상호 배제 잠금 기본 형식입니다. 잠금 대기가 짧아야 하는 시나리오에서 SpinLock은 다른 형태의 잠금보다 향상된 성능을 제공합니다. 자세한 내용은 SpinLock을 참조하세요. |
System.Threading.SpinWait | 지정된 시간 동안 스핀하고 스핀 수를 초과하는 경우 결국 스레드를 대기 상태로 전환하는 작고 간단한 형식입니다. 자세한 내용은 SpinWait을 참조하세요. |
자세한 내용은 다음을 참조하세요.
초기화 지연 클래스
초기화 지연을 사용하면 필요할 때까지 개체용 메모리가 할당되지 않습니다. 초기화 지연을 통해 개체 할당을 프로그램 수명에 균등하게 분산하여 성능을 향상시킬 수 있습니다. Lazy<T> 형식을 래핑하여 모든 사용자 지정 형식에 대한 초기화 지연을 사용하도록 설정할 수 있습니다.
다음 표에는 초기화 지연 형식이 나와 있습니다.
Type | 설명 |
---|---|
System.Lazy<T> | 간단하고 스레드로부터 안전한 초기화 지연을 제공합니다. |
System.Threading.ThreadLocal<T> | 각 스레드가 초기화 함수 호출을 지연시켜 스레드별 기준으로 초기화가 지연된 값을 제공합니다. |
System.Threading.LazyInitializer | 전용 초기화 지연 인스턴스를 할당할 필요가 없도록 하는 정적 메서드를 제공합니다. 대신 참조를 사용하여 대상이 액세스될 때 초기화되었는지 확인합니다. |
자세한 내용은 초기화 지연을 참조하세요.
집계 예외
System.AggregateException 형식은 개별 스레드에서 동시에 throw되는 여러 예외를 캡처하고 조인 스레드에 단일 예외로 반환하는 데 사용할 수 있습니다. System.Threading.Tasks.Task 및 System.Threading.Tasks.Parallel 형식과 PLINQ는 이 용도로 AggregateException을 광범위하게 사용합니다. 자세한 내용은 예외 처리 및 방법: PLINQ 쿼리의 예외 처리를 참조하세요.
참고 항목
.NET