生产者-消费者问题

1.一个生产者,一个消费者,一个缓冲池

emptySemaphore(空信号量),fullSemaphore(满信号量) 

buffer[](缓冲区);

produce(){

      wait(emptySemaphore);

      buffer 数量增加

      signal(fullSemaphore);

}

customer(){

      wait(fullSemaphore);

      buffer 数量减少   

      signal(emptySemaphore);

}


2.一个生产者,一个消费者,环形缓冲区

emptySemaphore(空信号量),fullSemaphore(满信号量);

1-n buffer[](环形缓冲区),  

in(向缓冲区放入产品指针) out(向缓冲区中拿走产品指针)

produce(){

      wait(emptySemahore)

      buffer(in) 增加 //in指向的缓冲区产品增加

      in = (in+1) mod n;//循环利用缓冲区,所以采用取模的方式

      signal(fullSemaphore);

}

cusotmer(){

       wait(fullSemaphore);

       buffer(out);//out 指向缓冲区产品减少

       out = (out+1) mode n;  

       signal(emptySemaphore);

}

3.多个生产者,多个消费者,环形缓冲区

生产者与消费者存在同步关系,各个生产者之间,各个消费者之间存在互斥关系,他们必须互斥的访问缓冲区


emptySemaphore(空信号量),fullSemaphore(满信号量);

1-n buffer[](环形缓冲区), 

in(向缓冲区放入产品指针) out(向缓冲区中拿走产品指针)

produceMutex(生产者互斥信号量),customerMutex(消费者互斥信号量)


produce(){

      wait(emptySemaphore);

      wait(produceMutex);

      buffer(in); 

      in = (in+1) mode n;

      signal(produceMutex);

      signal(fullSemaphore);

}

customer(){

      wait(fullSemaphore);

      wait(customerMutex);

      buffer(out);

      out = (out+1) mode n;

      signal(customerMutex);

      signal(emptySemaphore);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值