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

本文深入探讨了生产者-消费者问题的经典解决方案,通过信号量和互斥锁确保了资源的正确访问。详细介绍了如何使用AND信号量避免死锁风险,确保了生产者和消费者在共享缓冲池中高效且安全地交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值