producer consumer pattern
**Producer-Consumer Pattern** — a fundamental concurrency pattern where producer threads generate data and consumer threads process it, communicating through a shared buffer.
**Architecture**
```
[Producer 1] →→
[Producer 2] →→ [Shared Buffer/Queue] →→ [Consumer 1]
[Producer 3] →→ →→ [Consumer 2]
```
**Bounded Buffer Implementation**
- Fixed-size queue (ring buffer) between producers and consumers
- Producers block when buffer is full (back-pressure)
- Consumers block when buffer is empty (no work)
- Synchronization: Mutex + two condition variables (not_full, not_empty)
**Benefits**
- **Decoupling**: Producers and consumers run at different speeds
- **Buffering**: Absorbs bursts in production/consumption rates
- **Scalability**: Add producers or consumers independently
**Lock-Free Variants**
- **SPSC (Single-Producer Single-Consumer)**: Ring buffer with atomic head/tail pointers — no locks needed. Fastest option when topology matches
- **MPMC (Multi-Producer Multi-Consumer)**: More complex, often uses CAS. Examples: Java ConcurrentLinkedQueue, Disruptor
**Common Applications**
- Web server: Accept thread (producer) → request queue → worker threads (consumers)
- Pipeline processing: Each stage is consumer of previous, producer for next
- Logging: Application threads produce log entries → log writer consumes
**Producer-consumer** is ubiquitous — it appears in virtually every concurrent system from operating systems to web servers.