.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.Task 및 System.Threading.Tasks.Parallel 형식과 PLINQ는 이 용도로 AggregateException를 광범위하게 사용합니다. 자세한 내용은 예외 처리 및 방법: PLINQ 쿼리에서 예외 처리를 참조하세요.
참고하십시오
.NET