循环队列是非常有用的一个数据结构,在单读、单写入的情况下可以不必对共享的队列数据进行加锁,非常有利于提升并发的性能。下面是一个实例程序:
#include <vector>
#include <stdio.h>
template<typename T>
class CircularQueue {
public:
CircularQueue(const size_t& size) : size_(size + 1), read_index_(0), write_index_(0) {
data_.reserve(size_);
}
bool Push(const T& element) {
size_t next_index = (write_index_ + 1) % size_;
if (next_index == read_index_) {
return false;
} else {
data_[write_index_] = element;
write_index_ = next_index;
}
}
bool Pop(T* element) {
if (read_index_ == write_index_) {
return false;
} else {
*element = data_[read_index_];
read_index_ = (read_index_ + 1) % size_;
}
}
private:
size_t read_index_;
size_t write_index_;
size_t size_;
std::vector<T> data_;
};
int main(int argc, char** argv) {
CircularQueue<int> circular_queue(100);
int index = 0;
while (circular_queue.Push(index)) {
printf("%d\n", index);
index++;
}
int value;
while (circular_queue.Pop(&value)) {
printf("--%d--\n", value);
}
}
值得一提的是boost有circular buffer的实现
参考文献:
http://en.wikipedia.org/wiki/Circular_buffer#Record_last_operation
http://www.boost.org/doc/libs/1_39_0/libs/circular_buffer/doc/circular_buffer.html