libe3 0.2.5
C++ library for E3AP RAN vendor integration
Loading...
Searching...
No Matches
libe3::LockFreeQueue< T > Class Template Reference

Lock-free bounded blocking queue. More...

#include <lockfree_queue.hpp>

Public Member Functions

 LockFreeQueue (size_t capacity=128)
 Construct a LockFreeQueue.
 ~LockFreeQueue ()
 Destructor – signals shutdown so any blocked pop() returns.
 LockFreeQueue (const LockFreeQueue &)=delete
LockFreeQueue & operator= (const LockFreeQueue &)=delete
 LockFreeQueue (LockFreeQueue &&)=delete
LockFreeQueue & operator= (LockFreeQueue &&)=delete
ErrorCode push (T item)
 Enqueue an item (non-blocking, lock-free).
T pop ()
 Dequeue an item, blocking indefinitely until one is available.
std::optional< T > pop (std::chrono::milliseconds timeout)
 Dequeue an item with a maximum wait duration.
std::optional< T > try_pop ()
 Try to dequeue without blocking.
bool empty () const
 Return true if the queue appears empty (approximate).
size_t size () const
 Return the approximate number of items in the queue.
size_t capacity () const noexcept
 Return the ring buffer capacity (always a power of two).
void clear ()
 Discard all items currently in the queue.
void shutdown ()
 Signal shutdown so that all blocked pop() calls return promptly.
bool is_shutdown () const
 Return true if shutdown() has been called.
void rearm ()
 Clear shutdown and discard any residual items so the queue is reusable after a shutdown(). The queue object itself is not moved, so any reference/pointer held by a consumer stays valid across a re-arm.

Detailed Description

template<typename T>
class libe3::LockFreeQueue< T >

Lock-free bounded blocking queue.

Built on an MPMC lock-free ring buffer. Blocking pop variants use an adaptive wait strategy:

  1. Spin with CPU pause hints (lowest latency, nanoseconds)
  2. Thread yield (cooperative, microseconds)
  3. Block on a condition variable, woken by push()/shutdown() (idle wait, avoids busy-loop when quiet; wake latency instead of a poll period)
Template Parameters
TElement type. Must be default-constructible and movable.

Definition at line 48 of file lockfree_queue.hpp.

Constructor & Destructor Documentation

◆ LockFreeQueue() [1/3]

template<typename T>
libe3::LockFreeQueue< T >::LockFreeQueue ( size_t capacity = 128)
inlineexplicit

Construct a LockFreeQueue.

Parameters
capacityMinimum ring buffer capacity (rounded up to next power of two, default 128).

Definition at line 55 of file lockfree_queue.hpp.

◆ ~LockFreeQueue()

template<typename T>
libe3::LockFreeQueue< T >::~LockFreeQueue ( )
inline

Destructor – signals shutdown so any blocked pop() returns.

Definition at line 65 of file lockfree_queue.hpp.

◆ LockFreeQueue() [2/3]

template<typename T>
libe3::LockFreeQueue< T >::LockFreeQueue ( const LockFreeQueue< T > & )
delete

◆ LockFreeQueue() [3/3]

template<typename T>
libe3::LockFreeQueue< T >::LockFreeQueue ( LockFreeQueue< T > && )
delete

Member Function Documentation

◆ capacity()

template<typename T>
size_t libe3::LockFreeQueue< T >::capacity ( ) const
inlinenoexcept

Return the ring buffer capacity (always a power of two).

Definition at line 201 of file lockfree_queue.hpp.

◆ clear()

template<typename T>
void libe3::LockFreeQueue< T >::clear ( )
inline

Discard all items currently in the queue.

Definition at line 204 of file lockfree_queue.hpp.

◆ empty()

template<typename T>
bool libe3::LockFreeQueue< T >::empty ( ) const
inline

Return true if the queue appears empty (approximate).

Definition at line 195 of file lockfree_queue.hpp.

◆ is_shutdown()

template<typename T>
bool libe3::LockFreeQueue< T >::is_shutdown ( ) const
inline

Return true if shutdown() has been called.

Definition at line 225 of file lockfree_queue.hpp.

◆ operator=() [1/2]

template<typename T>
LockFreeQueue & libe3::LockFreeQueue< T >::operator= ( const LockFreeQueue< T > & )
delete

◆ operator=() [2/2]

template<typename T>
LockFreeQueue & libe3::LockFreeQueue< T >::operator= ( LockFreeQueue< T > && )
delete

◆ pop() [1/2]

template<typename T>
T libe3::LockFreeQueue< T >::pop ( )
inline

Dequeue an item, blocking indefinitely until one is available.

Returns a default-constructed T{} if shutdown() is called while waiting.

Definition at line 112 of file lockfree_queue.hpp.

◆ pop() [2/2]

template<typename T>
std::optional< T > libe3::LockFreeQueue< T >::pop ( std::chrono::milliseconds timeout)
inline

Dequeue an item with a maximum wait duration.

Returns
The item on success; std::nullopt on timeout or shutdown.

Definition at line 148 of file lockfree_queue.hpp.

◆ push()

template<typename T>
ErrorCode libe3::LockFreeQueue< T >::push ( T item)
inline

Enqueue an item (non-blocking, lock-free).

Returns
ErrorCode::SUCCESS on success.
ErrorCode::BUFFER_TOO_SMALL if the ring buffer is full.
ErrorCode::NOT_INITIALIZED if shutdown() has been called.

Definition at line 82 of file lockfree_queue.hpp.

◆ rearm()

template<typename T>
void libe3::LockFreeQueue< T >::rearm ( )
inline

Clear shutdown and discard any residual items so the queue is reusable after a shutdown(). The queue object itself is not moved, so any reference/pointer held by a consumer stays valid across a re-arm.

Definition at line 234 of file lockfree_queue.hpp.

◆ shutdown()

template<typename T>
void libe3::LockFreeQueue< T >::shutdown ( )
inline

Signal shutdown so that all blocked pop() calls return promptly.

Definition at line 213 of file lockfree_queue.hpp.

◆ size()

template<typename T>
size_t libe3::LockFreeQueue< T >::size ( ) const
inline

Return the approximate number of items in the queue.

Definition at line 198 of file lockfree_queue.hpp.

◆ try_pop()

template<typename T>
std::optional< T > libe3::LockFreeQueue< T >::try_pop ( )
inline

Try to dequeue without blocking.

Returns
The item if one was available; std::nullopt otherwise.

Definition at line 188 of file lockfree_queue.hpp.


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