系统中有多个生产者进程和多个消费者进程,共享一个能存放1000件产品的环形缓冲区(初始为空)。当缓冲区未满时,生产者进程可以放入其生产的一件产品,否则等待;当缓冲区未空时,消费者进程可以从缓冲区取走一件产品,否则等待。要求:一个消费者进程从缓冲区连续取出10件产品后,其他消费者进程才可以取产品。请使用信号量P,V(wait(),signal())操作实现进程间的互斥与同步,要求写出完整的过程,并说明所用信号量的含义和初值。
//定义信号量
semaphore full = 0, empty = 1000, mutex = 1, consumermutex = 1;
int in = 0, out = 0;
//定义两个用来计数的变量,信号量不能用来做加减运算操作
item buffer[1000];
//定义缓冲区的大小
void consumer(){
while(true){ //消费者之间互斥,所以用consumermutex来保护起来
wait(consumermutex);
//进行取10个产品操作
for(int i=0; i<10; i++){
wait(full);
wait(mutex);//取产品和放产品互斥,用mutex
nextc = buffer[out];
out = (out+1)%1000;//注意这里的模运算
signal(mutex);
signal(empty);
}
signal(consumsermutex);
}
}
void producer(){
while(true){
wait(empty);
wait(mutex);
生产一个产品;
buffer[in] = nextp;//把产品放入缓冲区
in = (in+1)%1000;
signal(mutex);
signal(full);
}
}
void main(){
cobegin
consumer();
producer();
coend
}