[C#] 생산자 소비자 문제에 사용 가능한 Concurrent Class 사용하기
카테고리: C# + Unity
생산자-소비자 문제
생산자-소비자 문제(Producer-Consumer Problem)는 컴퓨터 과학에서 다중 스레드 또는 프로세스 간 협력 및 동기화에 관련된 전형적인 문제 중 하나이다. 여기서 생산자(Producer)는 공유 자원(버퍼나 큐 등)에 데이터를 생성하고 삽입하는 작업을 수행하고, 소비자(Consumer)는 공유 자원에서 데이터를 제거하고 소비하는 작업을 수행한다.
이때 발생할 수 있는 문제들은 크게 4가지로 분류한다.
- 동시성(Concurrency): 여러 생산자와 소비자가 동시에 실행될 수 있으므로, 공유 자원에 대한 안전한 액세스 보장
- 순서 보장(Ordering): 생산자가 데이터를 생성하고 삽입하는 순서와 소비자가 데이터를 제거하고 소비하는 순서 일치
- 공유 자원 보호: 여러 스레드 또는 프로세스가 공유 자원에 접근하면서 데이터의 손상을 방지하기 위한 상호 배제(Mutual Exclusion) 필요
- 대기 및 깨움(Waiting and Signaling): 생산자나 소비자가 작업을 수행할 수 있는 적절한 시점에 대기하고 있어야 함
운영체제를 공부하다보면 세마포어(Semaphore)나 뮤텍스(Mutex)와 같은 동기화 도구를 사용하여 공유 자원에 대한 접근을 제어하고, 조건 변수(Condition Variable)를 사용하여 생산자와 소비자 간의 통신을 관리한다.
하지만, C#에서는 System.Collections.Concurrent에 생산자-소비자 문제에 사용할 수 있는 여러 클래스들을 제공한다.
사용 가능한 클래스
1. BlockingCollection
BlockingCollection
2. ConcurrentBag, ConcurrentDictionary, ConcurrentQueue, ConcurrentStack
ConcurrentBag
https://learn.microsoft.com/ko-kr/dotnet/api/system.collections.concurrent.concurrentbag-1?view=net-8.0
https://learn.microsoft.com/ko-kr/dotnet/api/system.collections.concurrent.concurrentdictionary-2?view=net-8.0
https://learn.microsoft.com/ko-kr/dotnet/api/system.collections.concurrent.concurrentqueue-1?view=net-8.0
https://learn.microsoft.com/ko-kr/dotnet/api/system.collections.concurrent.concurrentstack-1?view=net-8.0
더 읽어 보기
https://devblogs.microsoft.com/pfxteam/faq-are-all-of-the-new-concurrent-collections-lock-free/