#include<cstdio>
#include<vector>
#include<pthread.h>
#include<semaphore.h>
#define MAX_QUEUE 5
class RingQueue{
public:
RingQueue(int maxq=MAX_QUEUE):_arry(maxq),_capacity(maxq),_write_step(0),_read_step(0){
sem_init(&_sem_lock,0,1);
sem_init(&_sem_idle,0,maxq);
sem_init(&_sem_data,0,0);
}
~RingQueue(){
sem_destroy(&_sem_data);
sem_destroy(&_sem_idle);
sem_destroy(&_sem_lock);
}
bool push(int data){
sem_wait(&_sem_idle);//判断有没有空闲空间
sem_wait(&_sem_lock);//加锁保护
_arry[_write_step]=data;
_write_step=(_write_step+1)%_capacity;
sem_post(&_sem_lock);//解锁操作
sem_post(&_sem_data);//数据空间增加一个
return true;
}
bool pop(int *data){
sem_wait(&_sem_data);//有没有数据
sem_wait(&_sem_lock);//加锁
*data=_arry[_read_step];
_read_step=(_read_step+1)%_capacity;
sem_post(&_sem_lock);//解锁
sem_post(&_sem_idle);//空闲空间计数+1
return true;
}
private:
std::vector<int>_arry;//实现环形队列的数组
int _capacity;//决定环形队列中的节点数量
int _write_step;//当前写入位置的下标
int _read_step;//当前读取位置的下标
sem_t _sem_lock;//用于实现互斥,保护_arry
sem_t _sem_data;//有效数据空间的个数
sem_t _sem_idle;//空闲空间的计数
};