C++实现循环阻塞队列CycleBlockingQueue
描述
1)循环阻塞队列采用生产者消费者模式;
2)循环阻塞队列内部采用了vector数组(也可使用链表)管理缓冲,并预先分配size+1的空间;
3)关于与之前博客中的线程池连用,需要扩展相应的函数接口;
源码
CycleBlockingQueue.h
#pragma once
#include<vector>
#include<mutex>
#include<condition_variable>
template<typename T>
class CycleBlockingQueue {
private:
std::vector<T>buffer;
int size;
int front = { 0 };
int rear = { 0 };
std::mutex mx;
std::condition_variable p_cond;
std::condition_variable c_cond;
bool isEmpty() {
return front == rear;
}
bool isFull() {
return (rear + 1) % size == front;
}
public:
CycleBlockingQueue(int bs) :
buffer(bs + 1), size(bs + 1) {
}
void push(T& val) {
std::unique_lock<std::mutex> lock(mx);
p_cond.wait(lock, [&]() {return !isFull(); });
buffer[rear] = val;
rear = (rear + 1) % size;
c_cond.notify_one();
}
T pop() {
std::unique_lock<std::mutex> lock(mx);
c_cond.wait(lock, [&]() {return !isEmpty(); });
T val = buffer[front];
front = (front + 1) % size;
p_cond.notify_one();
return val;
}
};