原理
初始化一个固定大小的数组,生产者指针指向写的位置,消费者指针指向读的位置,当指针到达数组尾部时从头开始,当两个指针在相同位置表示队列为空,当生产者指针的下一个位置为消费者指针时表示队列满
代码实现
#pragma once
#include <iostream>
#define DEFAULE_LIST_SIZE 128
template <class T>
class NoMtxList
{
public:
NoMtxList(uint32_t capacity)
{
_capacity = capacity;
_data = new T[capacity];
}
NoMtxList()
{
_capacity = DEFAULE_LIST_SIZE;
_data = new T[_capacity];
}
~NoMtxList()
{
if (nullptr != _data)
{
delete _data;
_data = nullptr;
}
_capacity = 0; _writePos = 0;
_readPos = 0;
}
int push(const T& data)
{
if (isFull())
{
return -1;
}
_data[_writePos] = data;
_writePos = (_writePos + 1) % _capacity;
return 0;
}
int pop(T& data)
{
if (isEmpty())
{
return -1;
}
data = _data[_readPos];
_readPos = (_readPos + 1) % _capacity;
return 0;
}
bool isFull()
{
return _readPos == (_writePos + 1) % _capacity;
}
bool isEmpty()
{
return _readPos == _writePos;
}
private:
uint32_t _capacity = 0;
T* _data = nullptr;
uint32_t _writePos = 0;
uint32_t _readPos = 0;
};
本文介绍了无锁队列的基本概念,包括其初始化、生产和消费操作。通过C++模板类`NoMtxList`展示了无锁队列的实现,包括插入(push)和移除(pop)操作,以及判断队列是否满和空的方法。无锁队列在多线程环境下能提供高效的数据同步机制。
1615





