libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
LibXR::LockFreePool< Data > Class Template Reference

无锁无序槽池 / Lock-free, unordered slot pool More...

#include <lockfree_pool.hpp>

Collaboration diagram for LibXR::LockFreePool< Data >:
[legend]

Data Structures

union  Slot
 单个槽结构体 / Individual slot structure (cache line aligned) More...
 

Public Types

enum class  SlotState : uint32_t { FREE = 0 , BUSY = 1 , READY = 2 , RECYCLE = UINT32_MAX }
 槽状态 / Slot state More...
 

Public Member Functions

 LockFreePool (uint32_t slot_count)
 构造对象池 / Constructor for the pool
 
 ~LockFreePool ()
 析构,释放槽池内存 / Destructor, releasing pool memory
 
ErrorCode Put (const Data &data)
 向池中放入一个元素 / Put an element into the pool
 
ErrorCode Put (const Data &data, uint32_t &start_index)
 向池中放入一个元素,返回起始槽索引 / Put an element into the pool and return the starting slot index
 
ErrorCode PutToSlot (const Data &data, uint32_t index)
 向指定槽放入一个元素 / Put an element into a specific slot
 
ErrorCode Get (Data &data)
 从池中取出一个元素 / Retrieve an element from the pool
 
ErrorCode Get (Data &data, uint32_t &start_index)
 从指定槽位开始,取出一个元素 / Retrieve an element from the pool
 
ErrorCode GetFromSlot (Data &data, uint32_t index)
 从指定槽位开始,取出一个元素 / Retrieve an element from the pool
 
ErrorCode RecycleSlot (uint32_t index)
 回收指定槽位 / Recycle a slot
 
size_t Size () const
 查询池中可取元素数量 / Query the number of available elements in the pool
 
size_t EmptySize ()
 查询当前池可用槽数量 / Query the number of writable slots in the pool
 
uint32_t SlotCount () const
 获取槽总数 / Get the total number of slots in the pool
 

Protected Member Functions

Slotoperator[] (uint32_t index)
 

Private Attributes

const uint32_t SLOT_COUNT
 槽总数 / Number of slots
 
Slotslots_
 槽数组指针 / Array of slots
 

Detailed Description

template<typename Data>
class LibXR::LockFreePool< Data >

无锁无序槽池 / Lock-free, unordered slot pool

该类实现了一个固定容量的无锁无序对象池,允许多个线程安全地并发存入(Put)和取出(Get)元素。每个槽独立管理,无严格顺序,适用于高性能、多线程或中断场景的数据缓存、对象重用等需求。

This class implements a lock-free, unordered slot/object pool with a fixed size. Multiple threads can safely Put (store) and Get (retrieve) elements concurrently. Each slot is managed independently, making it ideal for high-performance, multi-thread, or interrupt-safe buffering and object reuse.

Template Parameters
Data槽中存储的数据类型 / Type of data stored in each slot.

Definition at line 25 of file lockfree_pool.hpp.

Member Enumeration Documentation

◆ SlotState

template<typename Data >
enum class LibXR::LockFreePool::SlotState : uint32_t
strong

槽状态 / Slot state

Enumerator
FREE 

空闲,可写 / Slot is free and can be written.

BUSY 

正在写入 / Slot is being written.

READY 

写入完成,可读 / Slot contains valid data, ready to read.

RECYCLE 

已读待回收 / Slot was read, waiting for next write.

Definition at line 30 of file lockfree_pool.hpp.

31 {
32 FREE = 0,
33 BUSY = 1,
34 READY = 2,
35 RECYCLE = UINT32_MAX
36
37 };
@ RECYCLE
已读待回收 / Slot was read, waiting for next write.
@ READY
写入完成,可读 / Slot contains valid data, ready to read.
@ BUSY
正在写入 / Slot is being written.
@ FREE
空闲,可写 / Slot is free and can be written.

Constructor & Destructor Documentation

◆ LockFreePool()

template<typename Data >
LibXR::LockFreePool< Data >::LockFreePool ( uint32_t slot_count)
inline

构造对象池 / Constructor for the pool

Parameters
slot_count槽数量 / Number of slots in the pool
Note
包含动态内存分配。 Contains dynamic memory allocation.

Definition at line 59 of file lockfree_pool.hpp.

60 : SLOT_COUNT(slot_count),
61 slots_(new(std::align_val_t(LIBXR_CACHE_LINE_SIZE)) Slot[slot_count])
62 {
63 for (uint32_t index = 0; index < SLOT_COUNT; index++)
64 {
65 slots_[index].slot.state.store(SlotState::FREE, std::memory_order_relaxed);
66 }
67 }
Slot * slots_
槽数组指针 / Array of slots
const uint32_t SLOT_COUNT
槽总数 / Number of slots
std::atomic< SlotState > state
当前槽状态 / Current state

◆ ~LockFreePool()

template<typename Data >
LibXR::LockFreePool< Data >::~LockFreePool ( )
inline

析构,释放槽池内存 / Destructor, releasing pool memory

Definition at line 72 of file lockfree_pool.hpp.

72{ delete[] slots_; }

Member Function Documentation

◆ EmptySize()

template<typename Data >
size_t LibXR::LockFreePool< Data >::EmptySize ( )
inlinenodiscard

查询当前池可用槽数量 / Query the number of writable slots in the pool

Returns
可写入的空槽数 / Number of writable slots in pool

Definition at line 268 of file lockfree_pool.hpp.

269 {
270 uint32_t size = 0;
271 for (uint32_t index = 0; index < SLOT_COUNT; index++)
272 {
273 auto state = slots_[index].slot.state.load(std::memory_order_relaxed);
274 if (state == SlotState::FREE || state == SlotState::RECYCLE)
275 {
276 size++;
277 }
278 }
279 return size;
280 }

◆ Get() [1/2]

template<typename Data >
ErrorCode LibXR::LockFreePool< Data >::Get ( Data & data)
inline

从池中取出一个元素 / Retrieve an element from the pool

Parameters
[out]data获取到的数据 / Variable to store the retrieved data
Returns
操作结果 / Operation result:
  • ErrorCode::OK:成功取出 / Successfully retrieved
  • ErrorCode::EMPTY:池空,无可取元素 / Pool empty, no available element

Definition at line 153 of file lockfree_pool.hpp.

154 {
155 uint32_t start_index = 0;
156
157 return Get(data, start_index);
158 }
ErrorCode Get(Data &data)
从池中取出一个元素 / Retrieve an element from the pool

◆ Get() [2/2]

template<typename Data >
ErrorCode LibXR::LockFreePool< Data >::Get ( Data & data,
uint32_t & start_index )
inline

从指定槽位开始,取出一个元素 / Retrieve an element from the pool

Parameters
[out]data获取到的数据 / Variable to store the retrieved data
[in,out]start_index本次起始槽,返回本次实际取出槽位置 / Starting slot index, returned with the actual slot index
Returns
操作结果 / Operation result:
  • ErrorCode::OK:成功取出 / Successfully retrieved
  • ErrorCode::EMPTY:池空,无可取元素 / Pool empty, no available element

Definition at line 170 of file lockfree_pool.hpp.

171 {
172 for (uint32_t index = start_index; index < SLOT_COUNT; index++)
173 {
174 auto expected = slots_[index].slot.state.load(std::memory_order_acquire);
175 if (expected == SlotState::READY)
176 {
177 if (slots_[index].slot.state.compare_exchange_strong(expected, SlotState::BUSY,
178 std::memory_order_acquire,
179 std::memory_order_relaxed))
180 {
181 data = slots_[index].slot.data;
182 slots_[index].slot.state.store(SlotState::RECYCLE, std::memory_order_release);
183 start_index = index;
184 return ErrorCode::OK;
185 }
186 }
187 if (expected == SlotState::FREE)
188 {
189 start_index = 0;
190 return ErrorCode::EMPTY;
191 }
192 }
193
194 start_index = 0;
195 return ErrorCode::EMPTY;
196 }
Data data
槽内数据 / Stored data

◆ GetFromSlot()

template<typename Data >
ErrorCode LibXR::LockFreePool< Data >::GetFromSlot ( Data & data,
uint32_t index )
inline

从指定槽位开始,取出一个元素 / Retrieve an element from the pool

Parameters
data获取到的数据 / Variable to store the retrieved data
index槽索引 / Slot index
Returns
ErrorCode 操作结果 / Operation result:
  • ErrorCode::OK:成功取出 / Successfully retrieved
  • ErrorCode::EMPTY:池空,无可取元素 / Pool empty, no available element

Definition at line 207 of file lockfree_pool.hpp.

208 {
209 auto expected = slots_[index].slot.state.load(std::memory_order_acquire);
210 if (expected == SlotState::READY)
211 {
212 if (slots_[index].slot.state.compare_exchange_strong(expected, SlotState::BUSY,
213 std::memory_order_acquire,
214 std::memory_order_relaxed))
215 {
216 data = slots_[index].slot.data;
217 slots_[index].slot.state.store(SlotState::RECYCLE, std::memory_order_release);
218 return ErrorCode::OK;
219 }
220 }
221 return ErrorCode::EMPTY;
222 }

◆ operator[]()

template<typename Data >
Slot & LibXR::LockFreePool< Data >::operator[] ( uint32_t index)
inlineprotected

Definition at line 290 of file lockfree_pool.hpp.

291 {
292 if (index >= SLOT_COUNT)
293 {
294 ASSERT(false);
295 }
296 return slots_[index];
297 }

◆ Put() [1/2]

template<typename Data >
ErrorCode LibXR::LockFreePool< Data >::Put ( const Data & data)
inline

向池中放入一个元素 / Put an element into the pool

Parameters
data要存储的数据 / Data to store
Returns
操作结果 / Operation result:
  • ErrorCode::OK:成功放入 / Successfully put
  • ErrorCode::FULL:池满,无法放入 / Pool full, cannot put

Definition at line 82 of file lockfree_pool.hpp.

83 {
84 uint32_t start_index = 0;
85 return Put(data, start_index);
86 }
ErrorCode Put(const Data &data)
向池中放入一个元素 / Put an element into the pool

◆ Put() [2/2]

template<typename Data >
ErrorCode LibXR::LockFreePool< Data >::Put ( const Data & data,
uint32_t & start_index )
inline

向池中放入一个元素,返回起始槽索引 / Put an element into the pool and return the starting slot index

Parameters
data要存储的数据 / Data to store
start_index起始槽索引 / Starting slot index
Returns
ErrorCode 操作结果 / Operation result:
  • ErrorCode::OK:成功放入 / Successfully put
  • ErrorCode::FULL:池满,无法放入 / Pool full, cannot put

Definition at line 98 of file lockfree_pool.hpp.

99 {
100 for (uint32_t index = start_index; index < SLOT_COUNT; index++)
101 {
102 auto expected = slots_[index].slot.state.load(std::memory_order_relaxed);
103 if (expected == SlotState::FREE || expected == SlotState::RECYCLE)
104 {
105 if (slots_[index].slot.state.compare_exchange_strong(expected, SlotState::BUSY,
106 std::memory_order_release,
107 std::memory_order_relaxed))
108 {
109 slots_[index].slot.data = data;
110 slots_[index].slot.state.store(SlotState::READY, std::memory_order_release);
111 start_index = index;
112 return ErrorCode::OK;
113 }
114 }
115 }
116 return ErrorCode::FULL;
117 }

◆ PutToSlot()

template<typename Data >
ErrorCode LibXR::LockFreePool< Data >::PutToSlot ( const Data & data,
uint32_t index )
inline

向指定槽放入一个元素 / Put an element into a specific slot

Parameters
data要存储的数据 / Data to store
index槽索引 / Slot index
Returns
ErrorCode 操作结果 / Operation result:
  • ErrorCode::OK:成功放入 / Successfully put
  • ErrorCode::FULL:池满,无法放入 / Pool full, cannot put

Definition at line 128 of file lockfree_pool.hpp.

129 {
130 auto expected = slots_[index].slot.state.load(std::memory_order_relaxed);
131 if (expected == SlotState::FREE || expected == SlotState::RECYCLE)
132 {
133 if (slots_[index].slot.state.compare_exchange_strong(expected, SlotState::BUSY,
134 std::memory_order_release,
135 std::memory_order_relaxed))
136 {
137 slots_[index].slot.data = data;
138 slots_[index].slot.state.store(SlotState::READY, std::memory_order_release);
139 return ErrorCode::OK;
140 }
141 }
142 return ErrorCode::FULL;
143 }

◆ RecycleSlot()

template<typename Data >
ErrorCode LibXR::LockFreePool< Data >::RecycleSlot ( uint32_t index)
inline

回收指定槽位 / Recycle a slot

Parameters
index槽索引 / Slot index
Returns
ErrorCode 操作结果 / Operation result:
  • ErrorCode::OK:成功回收 / Successfully recycled
  • ErrorCode::EMPTY:池空,无可回收元素 / Pool empty, no available element

Definition at line 232 of file lockfree_pool.hpp.

233 {
234 auto expected = slots_[index].slot.state.load(std::memory_order_relaxed);
235 if (expected == SlotState::READY)
236 {
237 if (slots_[index].slot.state.compare_exchange_strong(expected, SlotState::RECYCLE,
238 std::memory_order_release,
239 std::memory_order_relaxed))
240 {
241 return ErrorCode::OK;
242 }
243 }
244 return ErrorCode::EMPTY;
245 }

◆ Size()

template<typename Data >
size_t LibXR::LockFreePool< Data >::Size ( ) const
inlinenodiscard

查询池中可取元素数量 / Query the number of available elements in the pool

Returns
当前池中READY元素个数 / Number of ready elements in pool

Definition at line 251 of file lockfree_pool.hpp.

252 {
253 uint32_t size = 0;
254 for (uint32_t index = 0; index < SLOT_COUNT; index++)
255 {
256 if (slots_[index].slot.state.load(std::memory_order_relaxed) == SlotState::READY)
257 {
258 size++;
259 }
260 }
261 return size;
262 }

◆ SlotCount()

template<typename Data >
uint32_t LibXR::LockFreePool< Data >::SlotCount ( ) const
inline

获取槽总数 / Get the total number of slots in the pool

Returns
uint32_t 槽总数

Definition at line 287 of file lockfree_pool.hpp.

287{ return SLOT_COUNT; }

Field Documentation

◆ SLOT_COUNT

template<typename Data >
const uint32_t LibXR::LockFreePool< Data >::SLOT_COUNT
private

槽总数 / Number of slots

Definition at line 300 of file lockfree_pool.hpp.

◆ slots_

template<typename Data >
Slot* LibXR::LockFreePool< Data >::slots_
private

槽数组指针 / Array of slots

Definition at line 301 of file lockfree_pool.hpp.


The documentation for this class was generated from the following file: