生产者消费者问题

一、问题描述

系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用。(注:这里的“产品”理解为某种数据)

特点:

生产者、消费者共享一个初始为空、大小为n的缓冲区。

只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待。

只有缓冲区不空时,消费者才能从中取出产品,否则必须等待。

缓冲区是临界资源,各进程必须互斥地访问。

缓冲区满时,生产者必须等待,缓冲区空时,消费者必须等待

分析同步互斥关系:

缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待。

同步关系——缓冲区满时,生产者必须等待消费者取走产品

只有缓冲区不空时,消费者才能从中取出产品,否则必须等待。

同步关系——缓冲区空时,消费者必须等待生产者取走产品

缓冲区是临界资源,各进程必须互斥地访问。

互斥关系

信号量机制实现:

互斥:设置初值为1的互斥信号量

同步:设置初值为0的同步信号量(实现一前一后)

//互斥信号量,实现对缓冲区的互斥访问
semaphore mutex = 1;
//同步信号量,表示空闲缓冲区的数量
semaphore full = n ;
//同步信号量,表示产品的数量,也即非空缓冲区的数量
semaphore empty = 0;

二、实现

//生产者
producer () 
{
    while(1)
    {
        生产一个产品;
        p(empty);//生产一个产品——消耗一个空闲缓冲区
        p(mutex);//要操作缓冲区,必须先上锁
        把产品放入缓冲区;
        v(mutex);//操作完之后,要解锁
        v(full);//增加一个产品
    }
}
​
//消费者
consumer () 
{
    while(1)
    {
        p(full);//消耗一个产品
        p(mutex);//加锁
        //从缓冲区取出一个产品
        v(mutex);//解锁
        v(empty);//增加一个空闲缓冲区
    }
}
​

实现互斥:在同一进程中进行一对pv操作

实现两进程同步:是在其中一个进程执行p,另一个进程中执行v

实现互斥的p操作一定要在实现同步的p操作之后,防止死锁。就是加锁只加在你要操作的代码区之间

v操作不会导致进程阻塞,因此v操作顺序可以交换

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值