最近在研究无锁编程相关的东西,特别是无锁数据结构,看了不少人的文章和博客,深受启发,于是决定动手基于数组实现一个C++的无锁队列。
基本数据结构
无锁队列的底层数据结构特别简单:
template <typename T>
class NolockQueue
{
public:
NolockQueue(int size);
~NolockQueue();
public:
int push(T *ptr);
int pop(T *&ptr);
inline int get_total() const;
inline int get_free() const;
int capacity() const {
return size;}
private:
struct Item
{
T *data;
};
private:
int size;
Item *array;
uint64_t consumer;
uint64_t producer;
};
用一个array数组放置指向数据的指针们,consumer表示pop操作弹出(获取)元素的位置,每次弹出consumer都会加1,producer表示push操作插入元素的位置,每次弹出producer都会加1,初始化时二者均为0:
template <typename T>
NolockQueue<T>::NolockQueue(int size)
{
array = reinterpret_cast<Item *>(new char[