#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
生产者与消费者场景的循环队列,用信号量实现(信号量)
最新推荐文章于 2022-03-22 11:30:45 发布