深入理解生产者与消费者问题

缓冲区的形象理解:
缓冲区好像使用一条传送带替代托架,传送带上一次可以放多个产品。
生产者在缓冲区尾加入数据,消费者在缓冲区头读取数据。缓冲区满时,缓冲区上锁并等待消费者线程读取数据;
每一个生产或消费动作使得传送带向前移动一个单位。因此,消费者读取数据的顺序与数据产生顺序相同。

引入一个count计数器表示已经被使用的缓冲区数量。

hNotEmptyEvent 和 hNotFullEvent来同步生产者和消费者线程。

每当生产者线程发现缓冲区满(count = BufferSize)
它就等待hNotEmptyEvent事件。

同理,当消费者线程发现缓冲区空,就开始等待hNotEmptyEvent。

生产者线程写入一个新的数据后,立刻发出hNotEmptyEvent来唤醒正在等待的消费者线程;

消费者线程在读取一个数据之后,就发出hNotFullEvent来唤醒正在等待的生产者线程。

程序设计的思想:
①设置while 循环 pi生产者访问临界区,得到权限访问缓冲区,如果缓冲区满,则等待。
②直到缓冲区非满,访问互斥锁,当得到互斥锁且缓冲区非满时,跳出while循环,开始生产新的数据,并把数据存放在Buffer缓冲区中,当数据存放结束则结束临界区;接着唤醒消费者线程;
?ci消费者访问临界区,得到权限访问缓冲区,如果缓冲区尾空,则没有可以处理的数据,则释放互斥锁且等待,直到缓冲区非空;
④缓冲区非空时,跳出while循环;

?消费者获得数据,并根据所获得的数据按类别消费。处理完数据后,结束临界区;接着唤醒生产者线程。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值