生产者和消费者问题

同学面试有遇到这个问题,说面试官很刁,答的不好。于是,我也翻了翻书,顿感有做笔记的必要。

概述

       生产者和消费者问题是关于同步的一个经典问题,即由一个或多个生产者(线程或进程)创建数据,然后由一个或多个消费者(线程或进程)处理。这里自然涉及到IPC。

一、单生产者、单消费者

       最简单的同步模型,以shell管道为例。

    ps -ef | grep in.telnetd

       这里,ps是生产者,grep是消费者,它们的同步方式为:如果生产者超前消费者(即管道被填满),内核在生产者调用写操作时将其投入睡眠,直到管道中有空余空间;如果消费者超前生产者(即管道为空),则内核在消费者调用读操作时将其投入睡眠,知道管道中有新的数据为止。这种同步方式完全由内核自行处理,我们称其隐式同步

二、多生产者、单消费者

       此模型一般多见于以共享内存作为IPC形式。在这里,单由内核解决不了问题,需要由我们自行操作各种同步机制,即显示同步。如图:

       该模型的同步场景有两种:

       a) 所有生产者完成生产工作,消费者才开始消费

       此场景下,没有生产者和消费者之间的同步问题,只需保证生产者不在同一时刻生产同一个buff数据,这里可用互斥锁保证一次只有一个生产者在生产。

       b) 生产者边生产,消费者边消费

       此场景下,生产者产生数据的同时,消费者就能知道并进行消费,此时,我们必须同步生产者和消费者,以确保消费者只处理由生产者已生产的数据。这里的同步方式为:当消费者进行消费时,首先对当前生产者加锁,防止别的生产者进行新的生产工作;然后等待已生产数据,若等到,则进行消费。在这里有个问题,就是消费者在等待生产者生成数据前,可以选择轮询或者投入睡眠。如果需要投入睡眠,可以使用条件变量方案。

       对此模型的扩展,是将其中共享的buff区用作一个环绕buff区,可通过使用Posix信号量方案解决。

三、多生产者,多消费者

       此模型实质是模型二的扩展,可通过Posix信号量解决。(略)

以上模型都需要关注同步问题,防止死锁。具体详情可参考《Unix网络编程:卷二》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值