经典进程的同步问题:生产者-消费者问题

版权声明:所有解释权归Chlid_heart所有 https://blog.csdn.net/Child_heart/article/details/82849352

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;
}

猜你喜欢

转载自blog.csdn.net/Child_heart/article/details/82849352