LockFreeQueue(无锁队列)
LibXR::LockFreeQueue<T> 是一个高性能单生产者多消费者(SPMC)无锁队列,适用于实时性要求高、并发访问频繁的嵌入式系统中。
类结构与原理
- 使用原子变量
head_和tail_管理队列索引。 - 所有操作使用 C++11 原子内存序保证线程安全。
- 环形缓冲结构支持批量读写,避免频繁中断。
- 多个消费者可以并发 Pop,生产者唯一。
特性概览
| 特性 | 支持 |
|---|---|
| 单生产者 | ✅ |
| 多消费者 | ✅ |
| 批量操作 | ✅ |
| Peek/Pop 分离 | ✅ |
| 动态容量 | ❌(固定容量) |
| 无锁保证 | ✅(C++11 atomic) |
接口函数
构造与销毁
LockFreeQueue(size_t length)(包含动态内存分配;length会按LIBXR_ALIGN_SIZE做对齐修正,最终逻辑容量以MaxSize()为准)~LockFreeQueue()
数据操作
ErrorCode Push(const T&)ErrorCode Pop(T&)ErrorCode Pop()(丢弃头部元素)ErrorCode Peek(T&)T* operator[](uint32_t index)
批量操作
PushBatch(const T* data, size_t size)PopBatch(T* data, size_t size)PeekBatch(T* data, size_t size)
工具接口
Size():当前元素数量EmptySize():剩余空间MaxSize():最大容量(元素个数)Reset():重置队列为空
使用示例
LibXR::LockFreeQueue<int> q(128);
q.Push(10);
int value;
if (q.Pop(value) == LibXR::ErrorCode::OK) {
// 使用 value
}
注意事项
- 仅适用于 单生产者 场景,多生产者需使用外部同步或其他队列方案。
- 容量固定,构造时需明确所需大小。
- 队列对象与
head_ / tail_使用 cache line 对齐(alignas(LIBXR_CACHE_LINE_SIZE)),可减少伪共享带来的性能损失。 operator[]返回的是底层数组槽位地址,主要用于调试或特殊用途。- 为满足对齐与实现需要,实际分配的队列容量可能大于构造入参
length;最终可用的逻辑容量以MaxSize()为准。
适用场景
- 中断与任务线程间的数据通信
- 实时日志收集
- 多线程传感器数据采样