环形缓冲区用固定数组和读写索引实现 FIFO。写指针到末尾后回绕到开头,因此无需移动已有数据,适合网络收发、音视频和单生产者单消费者队列。它的难点不在取模,而在于满与空的语义、索引发布顺序和容量满后的业务策略。
SPSC 的简单来自所有权明确
单生产者单消费者场景下,生产者只写 tail 和对应槽位,消费者只写 head 和对应槽位,索引可用合适的原子加载和存储协调。关键是生产者在数据完全写入后再发布 tail,消费者在读完数据后再发布 head;否则 CPU 重排序或编译器优化可能让另一端看到不完整内容。
多生产者或多消费者不能只把两个索引改成原子变量。多个线程可能竞争同一槽位,需要额外的序号、CAS 协议或每槽状态,并且要处理线程暂停后留下的空洞。选择 MPMC 算法前先确认是否真的需要它,很多系统通过单一收发线程就能保持简单可靠。
队列满时保什么,决定系统行为
日志和遥测可能允许丢旧数据,控制命令和资源释放消息则通常不能丢。不要把“缓冲区更大”当成唯一答案,它只会推迟拥塞并增加延迟。为每类消息定义容量、最大等待、丢弃计数和告警阈值,队列才是可观测的流量控制点。
参考:环形缓冲区设计与实现