Linux----生产者与消费者

模型场景

在这里插入图片描述

分析:

缓冲区buff中存放数据
生产者和消费者数目不固定,生产者向缓冲区写入数据,一次写入一个整形,消费者从缓冲区读数据,一次读一个并打印。

生产者写数据时生产者就不可以读取,反之亦然。因此需要互斥锁
多个生产者不可以同时写数据,多个消费者也不可以同时读数据。所以也需要互斥锁
生产者有空间才可以写,没有空间就不能写;消费者有数据才可以读,没有数据就不可以读。所有使用一个信号量不能完成

编程流程:

生产者同步流程

需要循环向buff写入数据:
1.P(sem_empty);判是否可以进行P操作,若可以代表缓冲区有空闲空间,此时空闲空间减一

必须先P操作后加锁:若没有剩余空间就不用加锁了

2.lock():给缓冲区加锁,加锁成功就向缓冲区写数据
3.buff[i] = n :向buff中写数据
4.unlock():写完数据,给缓冲区解锁
5.V(sem_full);生产者写完数据,有数据的空间就加一

消费者同步流程

需要循环从buff读数据:
1.P(sem_full);判是否可以进行P操作,若可以代表缓冲区有数据,此时数据数量减一
2.lock():给缓冲区加锁,加锁成功就从缓冲区读数据
3.printf(buff[i] ) :从buff中读数据并打印
4.unlock():读完数据,给缓冲区解锁
5.V(sem_empty);消费者读完数据,意味着缓冲区空的数目就增加一

代码实现

主函数

在这里插入图片描述

生产者线程函数

在这里插入图片描述

消费者线程函数

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值