操作系统——生产者消费者
有界缓冲问题
有n个生产者和m个消费者,连接在一个有k个单位缓冲区的有界缓冲上。其中,pi和cj都是并发进程,只要缓冲区未满,生产者pi生产的产品就可投入缓冲区;只要缓冲区不空,消费者进程cj就可从缓冲区取走并消耗产品。
模型:
int k; //k个单位的缓冲区 typedef anyitem item; //item类型 item buffer[k]; //缓冲区 int in=0,out=0,counter=0; //in是生产者的定位 out是消费者的定位 counter是产品 //生产者线程 process producer(void) { while (true) { {produce an item in nextp}//生产下一个产品 if (counter==k) //缓冲满时,生产者睡眠 sleep(producer); //sleep和wakeup系统内核函数,供应用程序调用 buffer[in]=nextp; in=(in+1)%k; //循环队列 counter++; //产品 if(counter==1) wakeup(consumer); //唤醒消费者 } } //消费者线程 process consumer(void) { while (true) { if (counter==0) //缓冲区空,消费者睡眠 sleep(consumer); nextc=buffer[out]; out=(out+1)%k; //循环对列 counter--; //产品 if(counter==k-1) //取走一件产品,唤缓冲区有新的位置 wakeup(producer); //醒生产者 {consume the item in nextc};//消费产品 } }