카테고리:

1 분 소요

생산자-소비자 문제

생산자-소비자 문제(Producer-Consumer Problem)는 컴퓨터 과학에서 다중 스레드 또는 프로세스 간 협력 및 동기화에 관련된 전형적인 문제 중 하나이다. 여기서 생산자(Producer)는 공유 자원(버퍼나 큐 등)에 데이터를 생성하고 삽입하는 작업을 수행하고, 소비자(Consumer)는 공유 자원에서 데이터를 제거하고 소비하는 작업을 수행한다.

이때 발생할 수 있는 문제들은 크게 4가지로 분류한다.

  1. 동시성(Concurrency): 여러 생산자와 소비자가 동시에 실행될 수 있으므로, 공유 자원에 대한 안전한 액세스 보장
  2. 순서 보장(Ordering): 생산자가 데이터를 생성하고 삽입하는 순서와 소비자가 데이터를 제거하고 소비하는 순서 일치
  3. 공유 자원 보호: 여러 스레드 또는 프로세스가 공유 자원에 접근하면서 데이터의 손상을 방지하기 위한 상호 배제(Mutual Exclusion) 필요
  4. 대기 및 깨움(Waiting and Signaling): 생산자나 소비자가 작업을 수행할 수 있는 적절한 시점에 대기하고 있어야 함

운영체제를 공부하다보면 세마포어(Semaphore)나 뮤텍스(Mutex)와 같은 동기화 도구를 사용하여 공유 자원에 대한 접근을 제어하고, 조건 변수(Condition Variable)를 사용하여 생산자와 소비자 간의 통신을 관리한다.

하지만, C#에서는 System.Collections.Concurrent에 생산자-소비자 문제에 사용할 수 있는 여러 클래스들을 제공한다.

사용 가능한 클래스

1. BlockingCollection

BlockingCollection 클래스는 다른 클래스들과는 달리 경계 및 차단 기능을 제공한다.

https://learn.microsoft.com/ko-kr/dotnet/api/system.collections.concurrent.blockingcollection-1?view=net-8.0

2. ConcurrentBag, ConcurrentDictionary, ConcurrentQueue, ConcurrentStack

ConcurrentBag, ConcurrentDictionary<TKey,TValue>, ConcurrentQueue, ConcurrentStack 클래스들은 생산자 소비자 상황에서 안전한 List, Dictionary, Queue, Stack을 구현한 클래스들이다.

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/

태그: Concurrent, condition variable, producer-consumer, semaphore, 동시성, 모니터, 상호배제, 생산자소비자, 세마포어, 조건변수

업데이트: