跳到主要内容

LockFreePool

LibXR::LockFreePool<Data> 实现了一个固定容量、无序(unordered)的无锁对象/数据槽池。支持多线程(或中断上下文)并发 PutGet,每个槽独立管理,无严格入/出顺序,适合高并发、低延迟的缓存与对象复用场景。

类结构与原理

  • 槽池由 SLOT_COUNT 个槽组成,每个槽为 cache line 对齐的 Slot 联合体,包含:
    • std::atomic<SlotState> state:槽状态机(FREE → BUSY → READY → RECYCLE)。
    • Data data:槽内实际数据。
  • 通过 compare_exchange_strong 与 C++11 原子内存序(acquire/release/relaxed)实现无锁并发,保证可见性与有界时序。
  • 操作粒度为“单槽”,不同槽之间互不阻塞,冲突仅在同一槽上局部化。
  • Put/Get 可选择起始槽索引start_index),用于分散热点并减少线性探测开销。

接口函数

构造与销毁

  • LockFreePool(uint32_t slot_count)
  • ~LockFreePool()

写入(Put)

  • ErrorCode Put(const Data& data)
  • ErrorCode Put(const Data& data, uint32_t& start_index)
  • ErrorCode PutToSlot(const Data& data, uint32_t index)

读取(Get)

  • ErrorCode Get(Data& data)
  • ErrorCode Get(Data& data, uint32_t& start_index)
  • ErrorCode GetFromSlot(Data& data, uint32_t index)

回收

  • ErrorCode RecycleSlot(uint32_t index)

查询/工具

  • size_t Size() const:当前 READY 槽数量
  • size_t EmptySize():当前可写槽数量(FREERECYCLE
  • uint32_t SlotCount() const:槽总数

返回码约定:

  • ErrorCode::OK:成功
  • ErrorCode::FULL:无可写槽
  • ErrorCode::EMPTY:无可读槽

使用示例

基本存取

LibXR::LockFreePool<int> pool(64);

// 写入
if (pool.Put(42) == LibXR::ErrorCode::OK) {
// 写入成功
}

// 读取
int value = 0;
if (pool.Get(value) == LibXR::ErrorCode::OK) {
// 使用 value
}