package main
import (
"fmt"
"sync"
"time"
)
type ProducerConsumer struct {
buffer []int
mu sync.Mutex
cond *sync.Cond
size int
}
func NewProducerConsumer(size int) *ProducerConsumer {
pc := &ProducerConsumer{
buffer: make([]int, 0, size),
size: size,
}
pc.cond = sync.NewCond(&pc.mu)
return pc
}
func (pc *ProducerConsumer) Produce(item int) {
pc.mu.Lock()
defer pc.mu.Unlock()
// 等待缓冲区有空间
for len(pc.buffer) >= pc.size {
fmt.Printf("生产者等待,缓冲区已满\n")
pc.cond.Wait()
}
pc.buffer = append(pc.buffer, item)
fmt.Printf("生产: %d,缓冲区大小: %d\n", item, len(pc.buffer))
// 通知消费者
pc.cond.Signal()
}
func (pc *ProducerConsumer) Consume() int {
pc.mu.Lock()
defer pc.mu.Unlock()
// 等待缓冲区有数据
for len(pc.buffer) == 0 {
fmt.Printf("消费者等待,缓冲区为空\n")
pc.cond.Wait()
}
item := pc.buffer[0]
pc.buffer = pc.buffer[1:]
fmt.Printf("消费: %d,缓冲区大小: %d\n", item, len(pc.buffer))
// 通知生产者
pc.cond.Signal()
return item
}
func main() {
pc := NewProducerConsumer(3)
// 启动生产者
go func() {
for i := 1; i <= 10; i++ {
pc.Produce(i)
time.Sleep(200 * time.Millisecond)
}
}()
// 启动消费者
go func() {
for i := 0; i < 10; i++ {
pc.Consume()
time.Sleep(300 * time.Millisecond)
}
}()
time.Sleep(5 * time.Second)
}