我有一个关于如何在信号量集中使用共享内存缓冲区的问题。我正在做经典的消费者生产者问题,我将一个新项目添加到缓冲区堆栈,并根据调度程序,我想删除生产者生成的第一个项目。 以下是我的制作人和消费者代码:
int produce_item(){
int item = rand()%50 +1;
printf("Producer produces %d\n",item);
sleep(1);
return item;
}
void consume_item(int item){
printf("Consumer consumes %d\n",item);
sleep(2);
}
void* consumer(void * arg) {
int item, j=0;
while(1){
down(full);
down(mutex);
consume_item(item);
buffer[j++] = item;
up(mutex);
up(empty);
}
return 0;
}
void* producer(void* arg) {
int item, i;
while(1){
item = produce_item();
down(empty);
down(mutex);
buffer[i++]=item;
up(mutex);
up(full);
sleep(1);
}
我的缓冲区被视为全局变量
这是一个测试运行,它显示了我的问题,为什么它只是一遍又一遍地使用同一个项目?
Consumer consumes 32622
Producer produces 16
Consumer consumes 32622
Producer produces 22
Consumer consumes 32622
Producer produces 1
Consumer consumes 32622
Producer produces 16
Consumer consumes 32622
Producer produces 15