다음을 통해 공유


병렬 프로그래밍을 위한 데이터 구조

.NET은 동시 컬렉션 클래스 집합, 간단한 동기화 기본 형식 및 지연 초기화를 위한 형식을 포함하여 병렬 프로그래밍에 유용한 여러 형식을 제공합니다. 작업 병렬 라이브러리 및 PLINQ를 비롯한 모든 다중 스레드 애플리케이션 코드에서 이러한 형식을 사용할 수 있습니다.

동시 컬렉션 클래스

네임스페이스의 System.Collections.Concurrent 컬렉션 클래스는 가능한 한 잠금을 방지하고 잠금이 필요한 경우 세분화된 잠금을 사용하는 스레드로부터 안전한 추가 및 제거 작업을 제공합니다. 동시 컬렉션 클래스는 항목에 액세스할 때 사용자 코드가 잠금을 수행할 필요가 없습니다. 동시 컬렉션 클래스는 여러 스레드가 컬렉션에서 항목을 추가하고 제거하는 시나리오에서 사용자 구현 잠금과 같은 System.Collections.ArrayListSystem.Collections.Generic.List<T> 형식에 비해 성능을 크게 향상시킬 수 있습니다.

다음 표에서는 동시 컬렉션 클래스를 나열합니다.

유형 설명
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 스택입니다.

자세한 내용은 Thread-Safe 컬렉션을 참조하세요.

동기화 기본 형식

네임스페이스의 System.Threading 동기화 기본 형식을 사용하면 레거시 다중 스레딩 코드에 있는 고가의 잠금 메커니즘을 방지하여 세분화된 동시성과 더 빠른 성능을 구현할 수 있습니다.

다음 표에서는 동기화 유형을 나열합니다.

유형 설명
System.Threading.Barrier 각 태스크가 도착 신호를 보내고 일부 또는 모든 작업이 도착할 때까지 차단할 수 있는 지점을 제공하여 여러 스레드가 알고리즘에서 병렬로 작업할 수 있도록 합니다. 자세한 내용은 Barrier를 참조 하세요.
System.Threading.CountdownEvent 간단한 랑데부 메커니즘을 제공하여 포크 및 조인 시나리오를 간소화합니다. 자세한 내용은 CountdownEvent를 참조하세요.
System.Threading.ManualResetEventSlim 동기화 기본 형식으로는 System.Threading.ManualResetEvent과(와) 유사한 것이 있습니다. ManualResetEventSlim 가벼우면서도 프로세스 내 통신에만 사용할 수 있습니다.
System.Threading.SemaphoreSlim 리소스 또는 리소스 풀에 동시에 액세스할 수 있는 스레드 수를 제한하는 동기화 기본 형식입니다. 자세한 내용은 세마포 및 세마포Slim을 참조하세요.
System.Threading.SpinLock 잠금을 획득하려는 스레드가 양자를 생성하기 전에 일정 기간 동안 루프에서 기다리거나 회전하도록 하는 상호 배제 잠금 기본 형식입니다. 잠금 대기 시간이 짧을 것으로 예상되는 시나리오에서는 SpinLock 이 다른 형태의 잠금보다 더 나은 성능을 제공합니다. 자세한 내용은 SpinLock을 참조하세요.
System.Threading.SpinWait 스핀 수가 초과되면 지정된 시간 동안 회전하고 결국 스레드를 대기 상태로 만드는 작고 가벼운 형식입니다. 자세한 내용은 SpinWait을 참조하세요.

자세한 내용은 다음을 참조하세요.

지연 초기화 클래스

지연 초기화를 사용하면 개체에 대한 메모리가 필요할 때까지 할당되지 않습니다. 지연 초기화는 프로그램 수명 동안 개체 할당을 균등하게 분산하여 성능을 향상시킬 수 있습니다. 형식을 래핑하여 모든 사용자 지정 형식에 대해 지연 초기화를 사용하도록 설정할 수 있습니다 Lazy<T>.

다음 표에서는 지연 초기화 유형을 나열합니다.

유형 설명
System.Lazy<T> 가벼운 스레드 안전 느린 초기화를 제공합니다.
System.Threading.ThreadLocal<T> 각 스레드가 초기화 함수를 지연 호출하는 스레드별로 지연 초기화된 값을 제공합니다.
System.Threading.LazyInitializer 전용 지연 초기화 인스턴스를 할당할 필요가 없는 정적 메서드를 제공합니다. 대신 참조를 사용하여 대상에 액세스할 때 초기화되었는지 확인합니다.

자세한 내용은 지연 초기화를 참조하세요.

집계 예외

이 형식을 System.AggregateException 사용하여 별도의 스레드에서 동시에 throw되는 여러 예외를 캡처하고 단일 예외로 조인 스레드로 반환할 수 있습니다. System.Threading.Tasks.TaskSystem.Threading.Tasks.Parallel 형식과 PLINQ는 이 용도로 AggregateException를 광범위하게 사용합니다. 자세한 내용은 예외 처리방법: PLINQ 쿼리에서 예외 처리를 참조하세요.

참고하십시오