이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 69126|회답: 4

[출처] .NET/C# 스레드 안전 컬렉션 (콜레이션)

[링크 복사]
게시됨 2017. 6. 6. 오후 5:13:53 | | |
.NET Framework 1.0에서 도입된 컬렉션은 System.Collections 네임스페이스에서 찾을 수 있습니다. 이 컬렉션들, 특히 일반적으로 사용되는 ArrayList와 Hashtable은 Synchronized 속성을 통해 일종의 스레드 안전을 제공하며, 이 속성은 컬렉션과 관련된 스레드 안전 래퍼를 반환합니다. 래퍼는 각 추가 또는 제거 연산마다 전체 집합을 잠그면서 작동합니다. 따라서 컬렉션에 접근하려는 각 스레드는 잠금을 획득할 차례가 될 때까지 기다려야 합니다. 이는 확장 불가능하며 대규모 컬렉션의 성능 저하를 초래할 수 있습니다. 게다가 이 설계가 경쟁을 완전히 방지하지는 않습니다. 자세한 내용은 MSDN 웹사이트의 다음 페이지를 참조하세요: 일반 컬렉션에서의 동기화

.NET Framework 2.0에서 도입된 컬렉션 클래스는 System.Collections.Generic 네임스페이스에서 찾을 수 있습니다. 이 컬렉션 수업에는 List<T>, Dictionary< TKey, TValue 등이 포함됩니다> 이 클래스들은 .NET Framework 1.0 클래스에 비해 더 높은 타입의 보안성과 성능을 제공합니다. 하지만 .NET Framework 2.0 컬렉션 클래스는 스레드 동기화를 제공하지 않습니다; 여러 스레드에서 항목을 동시에 추가하거나 제거할 때는 사용자 코드가 모든 동기화를 제공해야 합니다.

.NET Framework 4에서 동시 컬렉션 클래스를 사용하는 것을 권장합니다. 이는 .NET Framework 2.0 컬렉션 클래스의 타입 안전성뿐만 아니라 .NET Framework 1.0 컬렉션이 제공하는 스레드 보안보다 더 효율적이고 완전한 스레드 보안을 제공하기 때문입니다.


일부 동시 컬렉션 유형은 SpinLock, SpinWait, SemaphoreSlim, CountdownEvent와 같은 경량 동기화 메커니즘을 사용하며, 이는 .NET Framework 4에서 새롭게 도입되었습니다. 일반적으로 위의 동기화 유형은 스레드를 실제 대기 상태로 전환하기 전에 짧은 시간 동안 "비시 스핀"을 사용합니다. 대기 시간이 매우 짧을 것으로 예상된다면, 스핀은 대기보다 훨씬 적은 연산 자원을 소모하며, 대기에는 커널 변환이 포함되어 많은 자원을 소비합니다. 회전을 사용하는 컬렉션 클래스의 경우, 이 효율성은 여러 스레드가 매우 빠른 속도로 항목을 추가하고 제거할 수 있음을 의미합니다. 제한과 차단에 대한 자세한 내용은 SpinLock과 SpinWait를 참조하세요. ConcurrentQueue<T>와 ConcurrentStack<T> 클래스는 잠금을 전혀 사용하지 않습니다. 대신 스레드 안전을 위해 상호 잠금 연산에 의존합니다.

설명

동시 컬렉션 클래스는 ICollection을 지원하기 때문에, IsSynchronized와 SyncRoot 속성이 관련이 없더라도 구현을 제공합니다. IsSynchronized는 항상 false를 반환하지만, SyncRoot는 항상 null(Visual Basic에서는 아무것도 없음)입니다.

다음 표는 System.Collections.Concurrent 네임스페이스의 컬렉션 유형을 나열합니다.



묘사
블로킹컬렉션<T>
<T> IProducerConsumerCollection 구현을 위한 모든 유형의 제한 및 차단 기능을 제공합니다. 자세한 내용은 BlockingCollection 개요를 참조하세요.
ConcurrentDictionary<TKey, TValue>
키/값은 사전의 스레드 안전 구현입니다.
동시 대기열<T>
FIFO(선입선출) 큐의 스레드 안전 구현.
컨커런스택<T>
LIFO(후입선출) 스택의 스레드 안전 구현.
컨커런티백<T>
순서가 맞지 않는 요소 집합의 스레드 안전 구현.
IProducerConsumerCollection<T>
타입은 반드시 구현되어야 합니다.블로킹컬렉션사용되는 인터페이스







이전의:.net/c# itextsharp를 사용해 PDF 코드를 생성하세요
다음:Install-Package: "MvvmLightLibs"는 이미 "CommonServiceLocator"에 대한 의존성이 정의되어 있습니다...
게시됨 2017. 11. 8. 오후 3:24:45 |
네, 배웠습니다
 집주인| 게시됨 2021. 2. 8. 오전 10:00:41 |
리스트<T>는 반복 중에 리스트가 전혀 수정되지 않으면 스레드 안전입니다.
 집주인| 게시됨 2021. 3. 23. 오전 11:32:46 |
ConcurrentDictionary는 새로운 업데이트 및 업데이트 기능을 지원합니다
https://www.itsvse.com/thread-2955-1-1.html

 집주인| 게시됨 2023. 6. 24. 오후 2:20:57 |
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com