1. MulitRingBuffer 设计与工作原理解析
环形缓冲区(Ring Buffer)是音视频处理、网络通信等实时系统中的核心数据结构。MulitRingBuffer 作为其多线程安全版本,需要解决生产者-消费者模型下的并发控制问题。我们先看基础结构:
cpp复制template<typename T>
class MulitRingBuffer {
private:
std::vector<T> buffer_;
size_t head_ = 0; // 写入位置
size_t tail_ = 0; // 读取位置
std::mutex mtx_;
std::condition_variable not_empty_;
std::condition_variable not_full_;
public:
explicit MulitRingBuffer(size_t capacity)
: buffer_(capacity) {}
void Enqueue(const T& item); // 生产者接口
T Dequeue(); // 消费者接口
};
1.1 环形存储机制
缓冲区使用定长数组实现环形存储,通过模运算实现位置循环:
cpp复制head_ = (head_ + 1) % buffer_.size(); // 写入后移动头指针
tail_ = (tail_ + 1) % buffer_.size(); // 读取后移动尾指针
这种设计相比链表实现的优势在于:
- 内存局部性好,CPU缓存命中率高
- 无动态内存分配开销
- 计算复杂度稳定为O(1)
1.2 并发控制实现
线程安全通过三个核心机制保障:
- 互斥锁(std::mutex):保护head_和tail_的原子修改
- 条件变量(std::condition_variable):
- not_empty_:缓冲区非空时唤醒消费者
- not_full_:缓冲区未满时唤醒生产者
- 双指针设计:head_和tail_分离读写位置
