AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
Acore::Impl::MPSCQueueNonIntrusive< T > Class Template Reference

C++ implementation of Dmitry Vyukov's lock-free MPSC queue (Non-Intrusive). More...

#include "MPSCQueue.h"

Classes

struct  Node
 A structure representing a node in the queue. More...
 

Public Member Functions

 MPSCQueueNonIntrusive ()
 Constructs a new MPSCQueueNonIntrusive object.
 
 ~MPSCQueueNonIntrusive ()
 Destroys the MPSCQueueNonIntrusive object.
 
void Enqueue (T *input)
 Enqueues a new item in the queue.
 
bool Dequeue (T *&result)
 Dequeues an item from the queue.
 

Private Member Functions

 MPSCQueueNonIntrusive (MPSCQueueNonIntrusive const &)=delete
 Deleted copy constructor.
 
MPSCQueueNonIntrusiveoperator= (MPSCQueueNonIntrusive const &)=delete
 Deleted copy assignment operator.
 

Private Attributes

std::atomic< Node * > _head
 Atomic pointer to the head node of the queue.
 
std::atomic< Node * > _tail
 Atomic pointer to the tail node of the queue.
 

Detailed Description

template<typename T>
class Acore::Impl::MPSCQueueNonIntrusive< T >

C++ implementation of Dmitry Vyukov's lock-free MPSC queue (Non-Intrusive).

This queue allows multiple producers to enqueue items concurrently, but only one consumer can dequeue items. The queue is lock-free and non-intrusive, meaning it does not modify the data types that are enqueued.

Template Parameters
TThe type of data that is being enqueued in the queue.

Constructor & Destructor Documentation

◆ MPSCQueueNonIntrusive() [1/2]

template<typename T >
Acore::Impl::MPSCQueueNonIntrusive< T >::MPSCQueueNonIntrusive ( )
inline

Constructs a new MPSCQueueNonIntrusive object.

Initializes the queue with a dummy node and sets up atomic pointers to the head and tail.

< Store with release to ensure visibility

45 : _head(new Node(nullptr)), _tail(_head.load(std::memory_order_acquire))
46 {
47 Node* front = _head.load(std::memory_order_acquire);
48 front->Next.store(nullptr, std::memory_order_release);
49 }
std::atomic< Node * > _head
Atomic pointer to the head node of the queue.
Definition MPSCQueue.h:125
std::atomic< Node * > _tail
Atomic pointer to the tail node of the queue.
Definition MPSCQueue.h:126

References Acore::Impl::MPSCQueueNonIntrusive< T >::_head, and Acore::Impl::MPSCQueueNonIntrusive< T >::Node::Next.

◆ ~MPSCQueueNonIntrusive()

template<typename T >
Acore::Impl::MPSCQueueNonIntrusive< T >::~MPSCQueueNonIntrusive ( )
inline

Destroys the MPSCQueueNonIntrusive object.

Dequeues all items and deletes them, followed by proper cleanup of remaining nodes in the queue.

57 {
58 T* output;
59 while (Dequeue(output))
60 delete output;
61
62 // Properly delete remaining nodes
63 Node* front = _head.load(std::memory_order_acquire);
64 while (front)
65 {
66 Node* next = front->Next.load(std::memory_order_acquire);
67 delete front;
68 front = next;
69 }
70 }
bool Dequeue(T *&result)
Dequeues an item from the queue.
Definition MPSCQueue.h:94

References Acore::Impl::MPSCQueueNonIntrusive< T >::_head, Acore::Impl::MPSCQueueNonIntrusive< T >::Dequeue(), and Acore::Impl::MPSCQueueNonIntrusive< T >::Node::Next.

◆ MPSCQueueNonIntrusive() [2/2]

template<typename T >
Acore::Impl::MPSCQueueNonIntrusive< T >::MPSCQueueNonIntrusive ( MPSCQueueNonIntrusive< T > const &  )
privatedelete

Deleted copy constructor.

Member Function Documentation

◆ Dequeue()

template<typename T >
bool Acore::Impl::MPSCQueueNonIntrusive< T >::Dequeue ( T *&  result)
inline

Dequeues an item from the queue.

This function removes the item at the front of the queue and returns it.

Parameters
resultReference to a pointer where the dequeued item will be stored.
Returns
True if an item was successfully dequeued, false if the queue was empty.
95 {
96 Node* tail = _tail.load(std::memory_order_acquire);
97 Node* next = tail->Next.load(std::memory_order_acquire);
98 if (!next)
99 return false;
100
101 result = next->Data;
102 _tail.store(next, std::memory_order_release);
103 delete tail;
104 return true;
105 }

References Acore::Impl::MPSCQueueNonIntrusive< T >::_tail, Acore::Impl::MPSCQueueNonIntrusive< T >::Node::Data, and Acore::Impl::MPSCQueueNonIntrusive< T >::Node::Next.

Referenced by Acore::Impl::MPSCQueueNonIntrusive< T >::~MPSCQueueNonIntrusive().

◆ Enqueue()

template<typename T >
void Acore::Impl::MPSCQueueNonIntrusive< T >::Enqueue ( T *  input)
inline

Enqueues a new item in the queue.

This function adds a new item at the head of the queue.

Parameters
inputPointer to the item to be enqueued.

< Exchange with acquire-release semantics

80 {
81 Node* node = new Node(input);
82 Node* prevHead = _head.exchange(node, std::memory_order_acq_rel);
83 prevHead->Next.store(node, std::memory_order_release);
84 }

References Acore::Impl::MPSCQueueNonIntrusive< T >::_head, and Acore::Impl::MPSCQueueNonIntrusive< T >::Node::Next.

◆ operator=()

template<typename T >
MPSCQueueNonIntrusive & Acore::Impl::MPSCQueueNonIntrusive< T >::operator= ( MPSCQueueNonIntrusive< T > const &  )
privatedelete

Deleted copy assignment operator.

Member Data Documentation

◆ _head

◆ _tail

template<typename T >
std::atomic<Node*> Acore::Impl::MPSCQueueNonIntrusive< T >::_tail
private

Atomic pointer to the tail node of the queue.

Referenced by Acore::Impl::MPSCQueueNonIntrusive< T >::Dequeue().


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