生产者 - 消费者问题
假设在生产者和消费者之间的公用缓冲池具有n个缓冲区,可利用互斥信号量mutex实现诸进程的互斥使用;利用信号量empty和full分别表示缓冲池中空缓冲区和满缓冲区的数量。
又假设这些生产者和消费者互相等效,只要缓冲池未满,生产者便可将消息送入缓冲池;只要缓冲池未空,消费者便可从缓冲池取走一个消息。
int in =0,out = 0;
item buffer[n]; //缓冲区列表
semaphore mutex = 1,empty = n,full = 0; //互斥信号量为1,起始缓冲区为空,没有产品
void producer(){ //生产者进程
do{
producer an item nextp;
...
P(empty); //申请一个空闲缓存区
P(mutex); //申请使用缓冲池
buffer[in] = nextp; //向缓冲池投放产品
in = (in+1)%n;
V(mutex); //释放使用缓冲池的资源
V(full); //缓冲池的产品数量加1
}while(TRUE);
}
void consumer(){
do{
producer an item nextp;
P(full); //产品数量减1
P(mutex); //申请使用缓冲池
nextc = buffer[out];
out = (out+1)%n;
V(mutex); //释放使用缓冲池的资源
V(empty); //缓冲池空闲区加1
consumer the item in nextc; //消费一个产品
...
}while(TRUE);
}
void main(){
cobegin
producer();consumer();
coend
}