qb  2.0.0.0
C++17 Actor Framework
qb Issue Watch Star Fork Follow @isndev
Loading...
Searching...
No Matches
qb::lockfree::mpsc::ringbuffer< T, max_size, nb_producer > Class Template Reference

Multi-Producer Single-Consumer ring buffer with fixed number of producers. More...

#include <mpsc.h>

Inheritance diagram for qb::lockfree::mpsc::ringbuffer< T, max_size, nb_producer >:
Collaboration diagram for qb::lockfree::mpsc::ringbuffer< T, max_size, nb_producer >:

Public Member Functions

template<size_t _Index>
bool enqueue (T const &t)
 Enqueue an item using a compile-time producer index.
template<size_t _Index, bool _All = true>
size_t enqueue (T const *t, size_t const size)
 Enqueue multiple items using a compile-time producer index.
bool enqueue (size_t const index, T const &t)
 Enqueue an item using a runtime producer index.
template<bool _All = true>
size_t enqueue (size_t const index, T const *t, size_t const size)
 Enqueue multiple items using a runtime producer index.
size_t enqueue (T const &t)
 Enqueue an item using a random producer index.
template<bool _All = true>
size_t enqueue (T const *t, size_t const size)
 Enqueue multiple items using a random producer index.
size_t dequeue (T *ret, size_t size)
 Dequeue multiple items from all producers.
template<typename Func>
size_t dequeue (Func const &func, T *ret, size_t const size)
 Dequeue multiple items with a function to process each item.
template<typename Func>
size_t consume_all (Func const &func)
 Process all available items from all producers.
auto & ringOf (size_t const index)
 Get direct access to a specific producer's ring buffer.
Public Member Functions inherited from qb::nocopy
 nocopy ()=default
 Default constructor.
 nocopy (nocopy const &)=delete
 Deleted copy constructor.
 nocopy (nocopy const &&)=delete
 Deleted move constructor.
nocopyoperator= (nocopy const &)=delete
 Deleted copy assignment operator.
nocopyoperator= (nocopy &&)=delete
 Deleted move assignment operator.

Detailed Description

template<typename T, std::size_t max_size, size_t nb_producer = 0>
class qb::lockfree::mpsc::ringbuffer< T, max_size, nb_producer >

Multi-Producer Single-Consumer ring buffer with fixed number of producers.

This implementation provides a lock-free MPSC ring buffer with a compile-time fixed number of producers. Each producer has its own dedicated SPSC ring buffer, eliminating contention between producers.

Template Parameters
TThe type of elements stored in the buffer
max_sizeThe maximum capacity per producer buffer
nb_producerThe number of producers (fixed at compile time)

Member Function Documentation

◆ enqueue() [1/6]

template<typename T, std::size_t max_size, size_t nb_producer = 0>
template<size_t _Index>
bool qb::lockfree::mpsc::ringbuffer< T, max_size, nb_producer >::enqueue ( T const & t)
inline

Enqueue an item using a compile-time producer index.

Template Parameters
_IndexThe compile-time index of the producer
Parameters
tThe item to enqueue
Returns
true if the item was successfully enqueued, false if the buffer was full

◆ enqueue() [2/6]

template<typename T, std::size_t max_size, size_t nb_producer = 0>
template<size_t _Index, bool _All = true>
size_t qb::lockfree::mpsc::ringbuffer< T, max_size, nb_producer >::enqueue ( T const * t,
size_t const size )
inline

Enqueue multiple items using a compile-time producer index.

Template Parameters
_IndexThe compile-time index of the producer
_AllIf true, requires all items to be enqueued or none
Parameters
tArray of items to enqueue
sizeNumber of items to enqueue
Returns
The number of items successfully enqueued

◆ enqueue() [3/6]

template<typename T, std::size_t max_size, size_t nb_producer = 0>
bool qb::lockfree::mpsc::ringbuffer< T, max_size, nb_producer >::enqueue ( size_t const index,
T const & t )
inline

Enqueue an item using a runtime producer index.

Parameters
indexThe runtime index of the producer
tThe item to enqueue
Returns
true if the item was successfully enqueued, false if the buffer was full

◆ enqueue() [4/6]

template<typename T, std::size_t max_size, size_t nb_producer = 0>
template<bool _All = true>
size_t qb::lockfree::mpsc::ringbuffer< T, max_size, nb_producer >::enqueue ( size_t const index,
T const * t,
size_t const size )
inline

Enqueue multiple items using a runtime producer index.

Template Parameters
_AllIf true, requires all items to be enqueued or none
Parameters
indexThe runtime index of the producer
tArray of items to enqueue
sizeNumber of items to enqueue
Returns
The number of items successfully enqueued

◆ enqueue() [5/6]

template<typename T, std::size_t max_size, size_t nb_producer = 0>
size_t qb::lockfree::mpsc::ringbuffer< T, max_size, nb_producer >::enqueue ( T const & t)
inline

Enqueue an item using a random producer index.

This method automatically selects a producer based on the current time, providing load balancing across producers.

Parameters
tThe item to enqueue
Returns
true if the item was successfully enqueued, false if the buffer was full

◆ enqueue() [6/6]

template<typename T, std::size_t max_size, size_t nb_producer = 0>
template<bool _All = true>
size_t qb::lockfree::mpsc::ringbuffer< T, max_size, nb_producer >::enqueue ( T const * t,
size_t const size )
inline

Enqueue multiple items using a random producer index.

This method automatically selects a producer based on the current time, providing load balancing across producers.

Template Parameters
_AllIf true, requires all items to be enqueued or none
Parameters
tArray of items to enqueue
sizeNumber of items to enqueue
Returns
The number of items successfully enqueued

◆ dequeue() [1/2]

template<typename T, std::size_t max_size, size_t nb_producer = 0>
size_t qb::lockfree::mpsc::ringbuffer< T, max_size, nb_producer >::dequeue ( T * ret,
size_t size )
inline

Dequeue multiple items from all producers.

This method tries to dequeue items from all producers' buffers until either the requested number of items is dequeued or all buffers are empty.

Parameters
retArray to store the dequeued items
sizeMaximum number of items to dequeue
Returns
The number of items successfully dequeued

◆ dequeue() [2/2]

template<typename T, std::size_t max_size, size_t nb_producer = 0>
template<typename Func>
size_t qb::lockfree::mpsc::ringbuffer< T, max_size, nb_producer >::dequeue ( Func const & func,
T * ret,
size_t const size )
inline

Dequeue multiple items with a function to process each item.

Template Parameters
FuncType of the function to process dequeued items
Parameters
funcFunction to process each dequeued item
retArray to store the dequeued items
sizeMaximum number of items to dequeue
Returns
The number of items successfully dequeued and processed

◆ consume_all()

template<typename T, std::size_t max_size, size_t nb_producer = 0>
template<typename Func>
size_t qb::lockfree::mpsc::ringbuffer< T, max_size, nb_producer >::consume_all ( Func const & func)
inline

Process all available items from all producers.

Template Parameters
FuncType of the function to process dequeued items
Parameters
funcFunction to process each dequeued item
Returns
The number of items successfully processed

◆ ringOf()

template<typename T, std::size_t max_size, size_t nb_producer = 0>
auto & qb::lockfree::mpsc::ringbuffer< T, max_size, nb_producer >::ringOf ( size_t const index)
inline

Get direct access to a specific producer's ring buffer.

Parameters
indexThe index of the producer
Returns
Reference to the producer's ring buffer