1.生产者-消费者问题
假定在生产者和消费者之间的公用缓冲池中具有n个缓冲区,消费者不能同时取一个缓冲区的产品,生产者不能同时向同一个缓冲区放入产品。只有缓冲区中有产品时,消费者才可以取产品,只有缓冲区有空时,生产者才可以放入产品。消费者与生产者也不能同时对同一个缓冲区进行操作。
int in=0,out=0;
item buffer[n];
semaphore mutex=1,empty=n,full=0;//empty代表缓冲池中的空的数量,full代表缓冲池中的产品数
void producer(){//生产者
do{
producer an item nextp;
...
wait(empty);//缓冲池是否为空,如果有空就继续进行,否则阻塞
wait(mutex);//实现生产者消费者之间的互斥
buffer[in]=nextp;
in=(in+1)%n;
signal(mutex);
signal(full);//释放产品的数量
}while(TRUE);
}
void consumer(){
do{
wait(full);//判断是否有产品
wait(mutex);
//取产品
nextc=buffer[out];
out=(out+1)%n;
signal(mutex);
signal(empty);
...
}while(TRUE)
}
void main(){
cobegin
proceder(); consumer();
coend;
}
,此方法需要连续申请两个信号量,所以有可能只申请了一个信号量,就被中断,可能会造成死循环,解决方法时使用AND信号量。
int in=0,out=0;
item buffer[n];
semaphore mutex=1,empty=n,full=0;//empty代表缓冲池中的空的数量,full代表缓冲池中的产品数
void producer(){//生产者
do{
producer an item nextp;
...
Swait(empty,mutex);//同时申请两个信号量
buffer[in]=nextp;
in=(in+1)%n;
signal(mutex);
signal(full);//释放产品的数量
}while(TRUE);
}
void consumer(){
do{
Swait(full,mutex);
//取产品
nextc=buffer[out];
out=(out+1)%n;
signal(mutex);
signal(empty);
...
}while(TRUE)
}
void main(){
cobegin
proceder(); consumer();
coend;
}